这里是AEM的新手。 说我有:
<div
data-text="${myVariable.someProperty}"
...
如果未定义,我不希望数据文本返回"undefined"
字符串。我尝试使用逻辑运算符,它没有工作..
<div
data-text="${myVariable.someProperty ? myVariable.someProperty : ''}"
我认为myVariable.someProperty
返回undefined而不是boolean值。我有什么想法可以检查HTL中的undefined(或者我做错了什么)?
答案 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}">