为什么它适用于 AngularJS (1.x) ?
ng-repeat
为每个迭代元素创建一个新范围,因此在isFlipped
迭代元素范围上设置属性(每个元素唯一):
该ngRepeat
指令为集合中的每个项目实例化一次模板。每个模板实例都有自己的范围,其中给定的循环变量设置为当前集合项,并$index
设置为项索引或键。
为什么它不能与 Angular (2+) 一起使用?
Angular 不再有作用域,因此当您设置isFlipped
属性时,它位于当前组件上,而不是与迭代元素相关的任何内容。
如果card
元素是 Objects :
对于您的特定情况,似乎每张卡片都是一个对象,因此您可以像@Harry Ninh 建议的那样isFlipped
为每个元素添加 aa 属性。考虑在定义元素的类或接口中声明此属性,否则 AOT 编译可能会失败。card
card
如果您不想在类/接口上添加上下文属性,请参阅“如果可以有多个翻转卡片(...)”部分。
如果只能翻转一张卡片:
如果您只能有一张翻转卡片,您可以currentCard
向组件添加一个属性,并将迭代卡片与模板中的当前卡片进行比较:
零件 :
export class MyComponent{
// (...)
currentCard:Card;
// (...)
}
模板 :
<div class="card" *ngFor="let card of cards">
<div class="flipcard" [ngClass]="{'flipped': card===currentCard }" (click)="currentCard = card">
</div>
</div>
如果可以有多个翻转的卡片并且card
元素不是对象或可以为空。
那么在这种情况下,您需要保持每个项目的翻转/未翻转状态,例如使用布尔数组或以card
值作为键和布尔值的对象
零件 :
export class MyComponent{
// (...)
cards: Card=[];
private flipped: boolean[];
flip(index:number){
this.flipped[index]=!this.flipped[index]
}
// (...)
}
模板 :
<div class="card" *ngFor="let card of cards: let i= index">
<div class="flipcard" [ngClass]="{'flipped': flipped[i] }" (click)="flip(i)">
</div>
</div>