2

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

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

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

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

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

4

5 回答 5

1

根据 HTL文档

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

如果一个值可以转换为false,则该值就是所谓的falsy。可以转换为 false 的值有:未定义的变量、值、数字zero字符串。

符合它,data-sly-test="${myVariable.someProperty == true}"应该做的工作。

于 2018-02-13T07:30:57.457 回答
1

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

逻辑.js:

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

和一个HTL 脚本:

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

输出将是:

<div></div>

该属性被剥离,因为它是虚假的(请参阅属性详细示例)。如果要保留该属性,您可能需要将 HTL 表达式修改为${logic.test || true}.

如果您修改您的使用对象以返回一个'undefined'字符串:

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

然后你会得到以下输出:

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

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

于 2018-02-13T08:21:20.867 回答
0

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

<!-- 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

于 2018-02-13T13:48:27.800 回答
0

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

<div data-text="No value defined" data-sly-test="${!hasValue}">
于 2019-09-13T11:42:35.510 回答
0

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

于 2021-08-30T17:39:01.207 回答