【问题标题】:Conditionaly render template based on item in array根据数组中的项目有条件地渲染模板
【发布时间】:2018-01-29 09:46:24
【问题描述】:

这是一个简单的例子,实际问题更复杂。

cars: string[] = ['audi', 'opel', 'mazda'];
isAudi: boolean = false;
isOpel: boolean = false;

checkCar(car):void {
    if(car == 'audi'){
        this.isAudi = true;
    }
}

<div *ngFor="let car of cars" (validationCheck)="checkCar(car)">
    <p *ngIf="isAudi">Audi: {{car}}</p>
    <p *ngIf="isOpel">Opel: {{car}}</p>
</div>

validationCheck 是为数组中的每个项目触发函数的指令。

这将输出:

Audi: audi
Audi: opel
Audi: mazda

我只想展示:

Audi: audi

*ngIf="car == 'audi'" 是不可能的,因为对象的真正复杂性。

附言。如果您想对一个问题投反对票,请给我一个很好的解释,为什么问题没有显示出研究成果或其不清楚或无用,谢谢

【问题讨论】:

  • 你认为对象为什么复杂?
  • 因为我需要做几个不同的条件来显示那个部分,例如*ngIf="car &amp;&amp; car.manufacturer &amp;&amp; manufacturers.get(car.manufacturer.id).manufacturer.name == 'fiat'....... and so on"...这里有一大堆条件很难维护所以我想把它放在组件文件中
  • 给每辆车添加一个布尔字段,比如show 怎么样?
  • 难道不能制作一个方法把你所有的复杂逻辑都写在一个地方并添加到模板*ngIf="yourComplexMethod()"中吗?通过这种方法,您不需要将 (validationCheck) 与 *ngFor 一起使用
  • 在每个变更检测周期都会调用该方法函数。我想避免这种情况。

标签: angular ngfor angular-ng-if


【解决方案1】:

你没有走在正确的轨道上。

标志“isAudi”绑定到每辆车:每辆车是不是奥迪。所以标志应该在车里,而不是在组件里。或者它应该从汽车中计算出来。

所以,解决方案一:

<div *ngFor="let car of cars">
  <p *ngIf="isAudi(car)">Audi: {{car}}</p>
  <p *ngIf="isOpel(car)">Opel: {{car}}</p>
</div>

isAudi(car: string) {
  return car === 'Audi';
}

isOpel(car: string) {
  return car === 'Opel';
}

第二个解决方案,如果由于 isAudi() 计算起来真的很复杂(我对此表示怀疑)导致性能问题,请使用对象,在获取数据时预先计算 isAudiisOpel,并将其与汽车一起存储:

interface FlaggedCar {
  car: string;
  isAudi: boolean;
  isOpel: boolean;
}

this.flaggedCars = cars.map(car => {
  return {
    car,
    isAudi: this.isAudi(car),
    isOpel: this.isOpel(car)
  }
});

<div *ngFor="let flaggedCar of flaggedCars">
  <p *ngIf="flaggedCar.isAudi">Audi: {{flaggedCar.car}}</p>
  <p *ngIf="flaggedCar.isOpel">Opel: {{flaggedCar.car}}</p>
</div>

当然,这假设汽车没有经过改装,也没有变成欧宝。或者每次汽车改变时都必须重新计算标志(这使得这个解决方案更加复杂)。

但同样,您可能不需要这种复杂性,因为 isAudi()isOpel() 可能足够快,可以从视图中调用。

【讨论】:

  • 很好的解释,谢谢。 “isAudi() 和 isOpel() 可能足够快”,是的,但是它们会在每个更改检测周期中被调用,如果从视图中调用,这是一个好方法吗?
  • 如果它足够快,它就足够快了,对吧?现在当然,如果您针对旧的移动设备并希望尽可能节省电池电量,您可以过度优化,但一般来说,过早的优化是万恶之源。
  • 好点,您对如何解决这个问题或首选方式有什么建议吗?内联视图条件、来自组件的函数调用还是第三者?
  • 我的回答不是很清楚吗?我建议使用第一种解决方案,如果确实需要优化,则使用第二种解决方案。
猜你喜欢
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 2020-04-27
  • 2018-04-21
相关资源
最近更新 更多