我可以在我包含的另一个文件中使用变量吗?
在我的 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。您可以在单独的文件中定义模板,并且可以传入参数。有关模板的说明,请查看以下文档链接 http://docs.adobe.com/docs/en/aem/6-0/develop/sightly.html#template
首先,对于给定的示例,不需要将属性传递给变量以使其在包含的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}"/>