如何在 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)