Adobe AEM很清楚如何重用变量

Adobe AEM很清楚如何重用变量,adobe,aem,sightly,htl,Adobe,Aem,Sightly,Htl,我可以在包含的另一个文件中使用变量吗 在我的HTL(file1.html)中,我有: 我可以在file2.html中使用myVar吗?我没有得到任何价值。是否有一种方法可以从file1.html中获取该值以在file2.html中使用您应该为此使用数据模板。您可以在单独的文件中定义模板,并可以传入参数。有关模板的说明,请查看以下文档链接 首先,对于给定的示例,没有必要将属性传递给变量,以使其在包含的file2.html中可用-properties是请求范围对象,这样您就可以访问file2.h

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

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



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

您应该为此使用数据模板。您可以在单独的文件中定义模板,并可以传入参数。有关模板的说明,请查看以下文档链接

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

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

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

最后,正如我们所看到的,Sling没有完全遵循没有全局对象或变量的规则(并且不能这样做,因为实现会非常棘手),在某些情况下,可能值得使用这些对象之一,
request
,并使用use API为其设置自定义属性。在需要传递数据且模板化过于繁琐的情况下,可以通过编写simple
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}" />

谢谢,我知道我可以使用模板。。但是还有别的吗?还有别的吗?想象一下,有一个名为templateFile.html的模板和一个使用它的使用者呈现脚本:`。您可以在被调用的呈现脚本中接收数据,就像HTL开发人员决定无论如何都应该有其他东西可用一样:。这并没有改变这样一个事实,即对于这个问题的示例,根本不需要传递属性!查看我的帖子以了解更多信息。仅在访问节点属性时,global.jsp引入了
properties
变量,但如果数据来自Sling模型IMHO,则最好使用模板而不是全局变量。
<sly data-sly-use="${'yourpackage.RequestScopeParameter' @ name='myVar', value=myVarValue}" />
<sly data-sly-use.param="${'yourpackage.RequestScopeParameter' @ name='myVar'}" />
${param.value}
<sly data-sly-include="${'script.html' @ requestAttributes=helper.attributesMap}"/>