如果此处提出的替代方案不适合您,您可以使用 Use-API 来写入和读取请求属性。
两个组件的快速示例,其中外部组件设置属性,然后由内部组件显示:
/apps/siteName/components/
outer/ [cq:Component]
outer.html
inner/ [cq:Component]
inner.html
utils/ [nt:folder]
setAttributes.js
getAttributes.js
/content/outer/ [sling:resourceType=siteName/components/outer]
inner [sling:resourceType=siteName/components/inner]
/apps/siteName/components/outer/outer.html:
<h1>Outer</h1>
<div data-sly-use="${'../utils/setAttributes.js' @ foo = 1, bar = 2}"
data-sly-resource="inner"></div>
/apps/siteName/components/inner/inner.html:
<h1>Inner</h1>
<dl data-sly-use.attrs="${'../utils/getAttributes.js' @ names = ['foo', 'bar']}"
data-sly-list="${attrs}">
<dt>${item}</dt> <dd>${attrs[item]}</dd>
</dl>
/apps/siteName/components/utils/setAttributes.js:
use(function () {
var i;
for (i in this) {
request.setAttribute(i, this[i]);
}
});
/apps/siteName/components/utils/getAttributes.js:
use(function () {
var o = {}, i, l, name;
for (i = 0, l = this.names.length; i < l; i += 1) {
name = this.names[i];
o[name] = request.getAttribute(name);
}
return o;
});
访问 /content/outer.html 时的结果输出:
<h1>Outer</h1>
<div>
<h1>Inner</h1>
<dl>
<dt>bar</dt> <dd>2</dd>
<dt>foo</dt> <dd>1</dd>
</dl>
</div>
正如@AlasdairMcLeay 所评论的那样,如果请求中多次包含内部组件,这个提议的解决方案会出现问题:组件的后续实例仍然会看到最初设置的属性。
这可以通过在访问属性时删除属性来解决(在 getAttributes.js 中)。但是,如果内部组件被拆分为多个都需要访问这些属性的 Sightly(或 JSP)文件,这将再次成为问题,因为访问请求属性的第一个文件也会删除它们。
这可以通过一个标志来进一步解决,该标志告诉在访问它们时是否应该删除属性......但它也说明了为什么使用请求属性不是一个好的模式,因为它基本上包括使用全局变量作为一种方式组件之间进行通信。因此,如果此处提出的其他两个解决方案不是一个选项,请将此视为一种解决方法。