2

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

在我的 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 中使用

4

2 回答 2

5

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

于 2017-07-26T12:27:45.460 回答
1

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

其次,HTL 是首字母缩略词“HTML模板语言”,这表明它的主要目的(就像其他流行的模板语言一样)是创建模板——在不同上下文中可重用的模式。尽管某些模板语言允许创建或扩展全局/请求范围变量,并且也可以使用 JSP 实现组件,但通常它被认为是一种不好的做法,这可能是它在 HTL 中受到限制的原因:为什么全局变量是邪恶的?

它没有在任何地方明确说明,但是,如果您将此作为 Sling/AEM 应用程序开发原则,那么如果您的file2.html不依赖于任何全局或请求范围变量(除了 Sling 中定义的变量)会更好(请求、资源、属性等)。

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

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: Additional parameters when using data-sly-resource?

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

编辑

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

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

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

于 2017-07-27T09:33:11.783 回答