AEM sightsly 如何重用变量

AEM sightly how to reuse variables

我可以在我包含的另一个文件中使用变量吗?

在我的 HTL (file1.html) 中我有:

<sly data-sly-test.myVar="${properties.myVarFromDialog}"></sly>
<sly data-sly-include="/file2.html"></sly>

我可以在 file2.html 中使用 myVar 吗?我没有得到任何价值。有没有办法从 file1.html 中获取该值以在 file2.html

中使用

你应该为此使用 data-sly-template。您可以在单独的文件中定义模板,并可以传入参数。有关模板的说明,请查看以下文档 link http://docs.adobe.com/docs/en/aem/6-0/develop/sightly.html#template

首先,对于给定的示例,没有必要将 属性 传递给变量以使其在包含的 file2.html - [=14 中可用=] 是请求范围对象,因此您可以在 file2.html 中访问您的它及其值 ${properties.myVarFromDialog} 而无需传递此变量。先前关于调用模板的答案适用于全局对象中不存在所需值的情况。例如,数据可能来自调用 data-sly-use(来自 Java WCMUse、Sling Model 或 JS Use API),然后它只有当前文件范围。

其次,HTL 是每个首字母缩略词 "HTML Template Language",这表明它的主要目的(与其他流行的模板语言一样)是创建模板 - 可在不同上下文中重用的模式。尽管一些模板语言允许创建或扩展 global/request 范围变量,并且也可以使用 JSP 进行组件实现,但通常它被认为是一种不好的做法,这可能是原因为什么它在 HTL 中受到限制:Why are global variables evil?

虽然没有明说,但是,如果你把这个作为Sling/AEM应用开发的原则,那你的file2.html[=52=就更好了] 不会依赖于任何全局或请求范围变量,除了 Sling 中定义的变量(请求、资源、属性等)。

最后,正如我们所看到的,Sling 没有完全遵循没有全局对象或变量的规则(并且不能这样做,因为实现起来会非常棘手),在某些情况下可能值得使用这些对象之一,request,并使用 Use API 为其设置自定义属性。在需要传递数据并且模板会过大的情况下,可以通过编写简单的 WCMUse class:

来实现设置请求范围变量的简单通用机制
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找到类似的解决方法 API: AEM 6.0: Additional parameters when using data-sly-resource?

最重要的是,请注意过度使用该解决方案是不值得的,因为全局变量会带来危险,即它们将在永远不会出现或错误访问的上下文中访问。在大多数情况下,更好的解决方案是创建无逻辑模板或拆分逻辑,方法是为每个包含的 HTL 文件创建单独的 WCMUse classes、Sling 模型、USe API JS 脚本。

编辑:

值得一提的是,还有一些步骤允许使用 data-sly-includedata-sly-resource 传递参数,因此下面的解决方案也可能适用于您,具体取决于您的 AEM Sightly 编译器版本:

<sly data-sly-include="${'script.html' @ requestAttributes=helper.attributesMap}"/>

https://issues.apache.org/jira/browse/SLING-5812