Подтвердить что ты не робот

AEM 6.0: Дополнительные параметры при использовании ресурса данных?

Я пытаюсь реализовать что-то, что, я надеюсь, относительно прямо вперед... У меня есть один компонент (позволяет называть его компонентом-оболочкой), который содержит другой компонент (позволяет называть его внутренним компонентом) внутри него с помощью данных -resource tag:

<div data-sly-resource="${ 'inner' @ resourceType='/projectname/components/inner' }"></div>

Я хотел бы передать некоторые дополнительные параметры с помощью этого тега, в частности параметр, который можно увидеть наглядно во внутреннем шаблоне компонента? Я пытаюсь указать, будет ли внешний внешний HTML-тег шаблонов разворачиваться на основе передаваемого параметра, когда компонент вызывается с помощью ресурса data-sly-resource.

После экспериментирования и просмотра обзорной документации я не могу найти способ добиться этого.

Кто-нибудь знает, возможно ли это?

Большое спасибо,

Dave

4b9b3361

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

Это может быть дополнительно обработано с флагом, указывающим, что атрибуты должны быть удалены или нет при обращении к ним... Но это также показывает, почему использование атрибутов запроса не является хорошим шаблоном, поскольку оно в основном состоит в использовании глобальных переменных как способ общения между компонентами. Поэтому рассмотрите это как обход, если другие два предложенных здесь решения не являются вариантом.

Ответ 2

К сожалению, нет. нет возможности расширить функциональность. вы не можете добавлять новые атрибуты данных или изменять существующие. Лучшее, что вы можете сделать, это написать свой собственный помощник, используя USE API

Ответ 3

Существует более новая функция, которая атрибуты запроса могут быть установлены в отношении данных и лукавого ресурса:

<sly data-sly-include="${ 'something.html' @ requestAttributes=amapofattributes}" />

К сожалению, не представляется возможным построить карту с HTL (= Sightly) выражениями, и я не вижу способа прочитать атрибут запроса из HTL, поэтому вам по-прежнему нужен некоторый код Java/Js для что.