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

How to check for undefined variable property in HTL (AEM)?

这里是 AEM 新手。 假设我有:

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

我不希望 return 未定义的 "undefined" 字符串有数据文本。我尝试使用逻辑运算符但它没有用..

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

我认为 myVariable.someProperty return 是未定义的,而不是布尔值。有什么想法可以检查 HTL 中的 undefined(或者我做错了什么)吗?

根据 HTL documentation

... operators are typically used with Boolean values, however, like in JavaScript, they actually return the value of one of the specified operands, so when used with non-Boolean values, they may return a non-Boolean value

If a value can be converted to false, the value is so-called falsy. Values that can be converted to false are: undefined variables, null values, the number zero, and empty strings.

符合它,data-sly-test="${myVariable.someProperty == true}"应该可以完成工作。

HTL 不会为未定义的值呈现任何内容。假设一个 JS 使用对象:

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 修改为 return 一个 'undefined' 字符串:

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

然后你得到以下输出:

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

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

来保留该属性

除了提供的其他解决方案之外,还有另一种方法可以实现类似的目的,尽管它看起来有点违反直觉和冗长:

<!-- 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 的结果存储在 hasValue 中,因此不必为第二个 div.

重复测试

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

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

data-sly-test="${myVariable.someProperty !=null}" 就这么简单就可以完成这项工作。它检查 属性 是否存在以及 returns“真”或“假”