AEM sightly как повторно использовать переменные
Могу ли я использовать переменные в другом файле, который я включаю?
В моем HTL (file1.html) у меня есть:
<sly data-sly-test.myVar="${properties.myVarFromDialog}"></sly>
<sly data-sly-include="/file2.html"></sly>
Могу ли я использовать myVar в file2.HTML-код ? Я не получаю никакой ценности. Есть ли способ получить это значение из файла 1?html для использования в file2.html
2 ответов:
Для этого следует использовать data-sly-template. Вы можете определить шаблоны в отдельном файле и передать параметры. Для получения объяснений по шаблонам проверьте следующую ссылку документации http://docs.adobe.com/docs/en/aem/6-0/develop/sightly.html#template
Во-первых, для данного примера не нужно передавать свойство переменной, чтобы сделать его доступным во включенном file2.html -
Во-вторых, HTL - это аббревиатура" HTML Template Language", которая предполагает, что ее основная цель (как и для других популярных языков шаблонов) - создание шаблонов-шаблонов, которые могут быть повторно использованы в различных контекстах. Несмотря на то, что некоторые языки шаблонов позволяют создавать или расширять глобальные переменные/переменные области запроса, а также использовать JSP для реализации компонентов, в целом это возможно. признана плохой практикой, и это может быть причиной, почему она ограничена в HTL: Почему глобальные переменные являются злом?propertiesявляется объектом области запроса, так что вы можете получить доступ к нему и его значению${properties.myVarFromDialog}в file2.html без необходимости передавать эту переменную. Предыдущий ответ о вызове шаблона затем применяется к случаям, когда необходимое значение отсутствует в глобальных объектах. Например, данные могут поступать путем вызоваdata-sly-use(из Java WCMUse, Sling Model или JS Use API), а затем он имеет только текущую область видимости файла.Это нигде явно не сказано, однако, если вы принимаете это как принцип разработки приложений Sling/AEM, то было бы лучше, если ваш файл2.html не будет зависеть от каких-либо глобальных переменных или переменных области запроса, кроме тех, которые определены в Sling (запрос, ресурс, свойства и т. д.).
Наконец, как мы видим, что Праща не полностью следуя правилу отсутствия глобальных объектов или переменных (и не может этого сделать, так как реализация была бы тогда довольно сложной), в некоторых случаях может быть полезно использовать один из этих объектов,
request, и установить пользовательский атрибут к нему с помощью Use API. В тех случаях, когда данные необходимо передать и шаблонизация будет излишней, можно реализовать простой и универсальный механизм задания переменной области запроса, написав simpleWCMUseкласс:package yourpackage; public class RequestScopeParameter extends WCMUse { String paramName; @Override public void activate() throws Exception { paramName = get("name", String.class); final Object paramValue = get("value", Object.class); if (paramName != null && paramValue != null) { getRequest().setAttribute(paramName, paramValue); } } public String getValue() { return paramName != null ? getRequest().getAttribute(paramName) : ""; } }Тогда для заданного значения вы можете сделать:
<sly data-sly-use="${'yourpackage.RequestScopeParameter' @ name='myVar', value=myVarValue}" />Для получения значения в другом файле:
<sly data-sly-use.param="${'yourpackage.RequestScopeParameter' @ name='myVar'}" /> ${param.value}Аналогичное решение можно найти и с JS Use API: AEM 6.0: Дополнительные параметры при использовании data-sly-resource?
Самое главное, пожалуйста, обратите внимание, что не стоит злоупотреблять этим решением, поскольку глобальные переменные сопряжены с опасностью того, что они будут доступны в контексте, где это никогда не должно происходить или доступ к которым осуществляется по ошибке. В в большинстве случаев лучшим решением является создание шаблонов без логики или разделение логики, путем создания отдельных классов WCMUse, моделей Sling, использования API JS-скриптов для каждого из включенных HTL-файлов.
EDIT:
Стоит отметить, что были также сделаны некоторые шаги, чтобы разрешить передачу параметров с
data-sly-includeиdata-sly-resource, так что решение ниже может также работать для вас в зависимости от вашего компилятора AEM Sightly версия:<sly data-sly-include="${'script.html' @ requestAttributes=helper.attributesMap}"/>
Comments