在 aurelia 视图中搜索数组中的元素

Searching for element in array in aurelia view

我正在使用 if.bind 有条件地显示视图中的元素。在我目前的情况下,我有类似于

<template>  
  <h2 if.bind="car.model === 'Ferrari' || car.model === 'Ford` || car.model === 'Renault'">
     ${ car.price}
  </h2>
</template>  

我希望将 if.bind 缩短为 if.bind="car.model in allModels 之类的内容,以避免出现许多 ||

(在 PHP 中有类似 in_array 的内容)

我有什么解决方案?

您可以在 Aurelia 中的 ifshow 绑定中使用 javascript 表达式。因此,如果您的 class 中有一个名为 allModels: string[] 的 属性,您只需使用 indexOf:

<h2 if.bind="allModels.indexOf(car.model) > -1">
    ${car.price}
</h2>

如果你没有 allModels 属性,你也可以硬编码:

if.bind="['Ferrari','Ford','Renault'].indexOf(car.model) > -1"

如果您不想对视图模型进行任何更改,Adiga 的回复显示了一种执行此操作的便捷方法。您可以考虑的一种替代方法是使用计算 属性 并将此逻辑移至视图模型中。您可以利用 computedFrom 装饰器来做到这一点:

app.js

import {computedFrom} from 'aurelia-framework'; 

export class App{
  car = { model : ''};

  constructor(){
    this.allModels = ['Ferrari','Ford','Renault'];
  }

  @computedFrom('car.model')
  get showCar() {
    return this.allModels.indexOf(this.car.model) > -1;
  }
}

那么在你看来你可以这样做:

app.html

<template>
    <h2 if.bind="showCar">
        ${car.price}
    </h2>
</template>

这样您可以清理视图逻辑,但也可以避免由于需要观察和重新计算 showCar 属性 而导致的脏检查。从功能上讲,这些方法是相同的,但如果您计划对视图模型进行单元测试,这种方法可能会让生活更轻松。