如何在 aurelia repeat for 中将字符串转换为表达式(值)?
How to convert string to expression ( value ) in aurelia repeat for?
重复for循环中使用的数组
let loopArr = ["item.name + ' /'+ item.DisplayName? item.DisplayName: item.otherDisplayName",
"item.description + ' /'+ item.anotherDescription"]
模板
<div repeat.for = item of data">
<div repeat.for = "row of loopArr">
<span textcontent.bind="renderRow(row, item)></span>
</div>
</div>
组件方法
renderRow(row, item){
return eval(row)
}
其实我想在模板中显示如下
<div repeat.for = item of data">
<div repeat.for = "row of loopArr">
<span>${item.name + ' /'+ item.DisplayName? item.DisplayName: item.otherDisplayName} </span>
<span>${item.description + ' /'+ item.anotherDescription} </span>
</div>
</div>
因为我想通过 dynamic loopArr 循环,而不是使用 eval 将字符串转换为值,有没有更好的方法来计算字符串的值?此外,eval 不适用于多行语句,是否还有其他 approach/way 可以处理上述问题?
如何将字符串转换为值并显示在 aurelia 模板中?
如有任何帮助,我们将不胜感激!
我不确定您为什么要添加字符串格式的逻辑并使用 eval
。您可以直接将其添加到 template
并显示它:
<div repeat.for="item of data">
<span>${item.name + '/' + (item.DisplayName ? item.DisplayName: item.otherDisplayName)}</span>
<span>${item.description + ' / '+ item.anotherDescription} </span>
</div>
假设您有一个自定义字符串格式列表,并且要从另一个文件导入它们。您可以创建一个 函数数组 而不是字符串数组。这是比 运行 eval
更好的延迟字符串创建的方法
displayTemplates = [
item => item.name + '/' + (item.DisplayName ? item.DisplayName: item.otherDisplayName),
item => item.description + '/'+ item.anotherDescription
]
然后在 template
:
<div repeat.for="item of data">
<template repeat.for="func of displayTemplates">
<span>${ func(item) }</span> <!-- call each func on item object -->
</template>
</div>
此外,您的字符串格式存在逻辑错误。 +
运算符与三元运算符相比有 higher precedence。
所以,
item.name + '/' + item.DisplayName ? item.DisplayName : item.otherDisplayName
实际计算为
(item.name + '/' + item.DisplayName) ? item.DisplayName : item.otherDisplayName
因此,此表达式的计算结果将始终为 item.DisplayName
,因为 item.name + '/' + item.DisplayName
永远不会是 falsy。
需要在三元运算前后加上()
:
item.name + '/' + (item.DisplayName ? item.DisplayName: item.otherDisplayName)
// OR
item.name + '/' + (item.DisplayName ?? item.otherDisplayName)
重复for循环中使用的数组
let loopArr = ["item.name + ' /'+ item.DisplayName? item.DisplayName: item.otherDisplayName",
"item.description + ' /'+ item.anotherDescription"]
模板
<div repeat.for = item of data">
<div repeat.for = "row of loopArr">
<span textcontent.bind="renderRow(row, item)></span>
</div>
</div>
组件方法
renderRow(row, item){
return eval(row)
}
其实我想在模板中显示如下
<div repeat.for = item of data">
<div repeat.for = "row of loopArr">
<span>${item.name + ' /'+ item.DisplayName? item.DisplayName: item.otherDisplayName} </span>
<span>${item.description + ' /'+ item.anotherDescription} </span>
</div>
</div>
因为我想通过 dynamic loopArr 循环,而不是使用 eval 将字符串转换为值,有没有更好的方法来计算字符串的值?此外,eval 不适用于多行语句,是否还有其他 approach/way 可以处理上述问题?
如何将字符串转换为值并显示在 aurelia 模板中?
如有任何帮助,我们将不胜感激!
我不确定您为什么要添加字符串格式的逻辑并使用 eval
。您可以直接将其添加到 template
并显示它:
<div repeat.for="item of data">
<span>${item.name + '/' + (item.DisplayName ? item.DisplayName: item.otherDisplayName)}</span>
<span>${item.description + ' / '+ item.anotherDescription} </span>
</div>
假设您有一个自定义字符串格式列表,并且要从另一个文件导入它们。您可以创建一个 函数数组 而不是字符串数组。这是比 运行 eval
displayTemplates = [
item => item.name + '/' + (item.DisplayName ? item.DisplayName: item.otherDisplayName),
item => item.description + '/'+ item.anotherDescription
]
然后在 template
:
<div repeat.for="item of data">
<template repeat.for="func of displayTemplates">
<span>${ func(item) }</span> <!-- call each func on item object -->
</template>
</div>
此外,您的字符串格式存在逻辑错误。 +
运算符与三元运算符相比有 higher precedence。
所以,
item.name + '/' + item.DisplayName ? item.DisplayName : item.otherDisplayName
实际计算为
(item.name + '/' + item.DisplayName) ? item.DisplayName : item.otherDisplayName
因此,此表达式的计算结果将始终为 item.DisplayName
,因为 item.name + '/' + item.DisplayName
永远不会是 falsy。
需要在三元运算前后加上()
:
item.name + '/' + (item.DisplayName ? item.DisplayName: item.otherDisplayName)
// OR
item.name + '/' + (item.DisplayName ?? item.otherDisplayName)