Ответ 1
Вы можете использовать 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) файлов, которым всем нужен доступ к этим атрибутам, потому что первый файл, который обращается к атрибутам запроса, также удалит их.
Это может быть дополнительно обработано с флагом, указывающим, что атрибуты должны быть удалены или нет при обращении к ним... Но это также показывает, почему использование атрибутов запроса не является хорошим шаблоном, поскольку оно в основном состоит в использовании глобальных переменных как способ общения между компонентами. Поэтому рассмотрите это как обход, если другие два предложенных здесь решения не являются вариантом.