如何在HTL(AEM)中检查未定义的变量属性?

时间:2018-02-13 02:52:53

标签: aem sightly htl

这里是AEM的新手。 说我有:

<div
     data-text="${myVariable.someProperty}"
     ...

如果未定义,我不希望数据文本返回"undefined"字符串。我尝试使用逻辑运算符,它没有工作..

<div
     data-text="${myVariable.someProperty ? myVariable.someProperty : ''}"

我认为myVariable.someProperty返回undefined而不是boolean值。我有什么想法可以检查HTL中的undefined(或者我做错了什么)?

4 个答案:

答案 0 :(得分:1)

根据HTL documentation

  

... 运算符通常与布尔值一起使用,但是,与在JavaScript中一样,它们实际上返回一个指定操作数的值,因此当与非布尔值一起使用时,它们可能会返回非布尔值

     

如果某个值可以转换为 false ,则该值为所谓的 falsy 。可以转换为false的值包括:未定义变量, null 值,数字字符串

遵守它,data-sly-test="${myVariable.someProperty == true}"应该完成这项工作。

答案 1 :(得分:1)

HTL不会为未定义的值渲染任何内容。假设有一个JS use-object:

<强> logic.js:

use(function () {
    return {
        test: undefined
    };
});

HTL脚本:

<div data-sly-use.logic="logic.js" data-text="${logic.test}"></div>

输出将是:

<div></div>

属性被删除,因为它是假的(参见attributes detailed examples)。如果要保留属性,可能需要将HTL表达式修改为${logic.test || true}

如果修改use-object以返回'undefined'字符串:

use(function () {
    return {
        test: 'undefined'
    };
});

然后你得到以下输出:

<div data-text="undefined"></div>

在这种情况下,您可能希望修改表达式以测试'undefined'字符串:${logic.test == 'undefined' ? '': logic.test}。同样,您可以通过将''替换为true来保留该属性。

答案 2 :(得分:0)

除了其他提供的解决方案之外,还有另一种方法可以实现这样的目标,即使它看起来有点反直觉和冗长:

Employee

上面的代码基本上是companySiteList.stream() .filter(companySite -> companySite.getId().equals("ID")) .flatMap(obj -> obj.getEmployeeList .stream() .filter(employee -> employee.getId().equals("ID_EMPLOYEE")) .map(emp -> new AbstractMap.SimpleEntry<Company,Employee>(obj,emp))) .forEach(entry -> orderFurniture (entry.getKey(),entry.getValue())); 语句。只显示<!-- Only show this div if "someProperty" is set --> <div data-text="${myVariable.someProperty}" data-sly-test.hasValue="${myVariable.someProperty}"> <!-- Show alternative div if "someProperty" is not set --> <div data-text="No value defined" data-sly-test="!hasValue"> 个元素中的一个。哪一个取决于if - else被设置与否。

请注意,div的结果存储在someProperty中,因此不必为第二个data-sly-test重复测试。

答案 3 :(得分:0)

jens的上述解决方案是正确的,但是hasValue变量的使用存在语法错误。

<div data-text="No value defined" data-sly-test="${!hasValue}">