代码之家  ›  专栏  ›  技术社区  ›  fernando

AEM如何重用变量

  •  2
  • fernando  · 技术社区  · 7 年前

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

    2 回复  |  直到 7 年前
        1
  •  5
  •   iusting    7 年前

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

        2
  •  1
  •   Kamil Ciecierski    7 年前

    文件2.html - properties 是请求范围对象,以便您可以访问it及其值 ${properties.myVarFromDialog} 文件2.html 无需传递此变量。然后,将前面关于调用模板的回答应用于全局对象中不存在所需值的情况。例如,数据可能通过调用 data-sly-use (来自Java WCMUse、Sling Model或JS Use API),然后它只有当前文件范围。

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

    文件2.html 不依赖于任何全局变量或请求范围变量,但Sling中定义的变量除外(请求、资源、属性等)。

    最后,正如我们可以看到的那样,Sling没有完全遵循没有全局对象或变量的规则(并且无法做到这一点,因为实现将非常棘手),在某些情况下,可能值得使用其中一个对象, request 使用API 。在需要传递数据并且模板化会过度的情况下,可以通过编写simple来实现一种简单通用的机制来设置请求范围变量 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?

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

    值得一提的是,还采取了一些步骤,允许通过 data-sly-include data-sly-resource

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

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