【发布时间】:2020-12-30 23:39:27
【问题描述】:
我在一个芯片列表中显示一些芯片:
<mat-chip-list>
<mat-chip *ngFor="let rockBand of this.rockBands"
[disableRipple]="true"
[selected]="rockBand.selected"
(click)="this.toggleSelection(rockBand)">{{ rockBand.name }}</mat-chip>
</mat-chip-list>
当用户点击芯片时,会调用以下函数:
public toggleSelection(rockBand: RockBand): void {
rockBand.selected = !rockBand.selected;
}
但是,切换所选值会导致以下错误:
ExpressionChangedAfterItHasBeenCheckedError:表达式在检查后已更改。 'attr.aria-selected' 的先前值:'true'。当前值:'null'。
我知道mat-chip-list 有一个名为multiple 的输入属性,它指示是否应允许用户选择多个芯片。在我的场景中,用户一次只能选择一个芯片,就像单选按钮一样,如果已经选择了芯片,则取消选择它。将点击功能更改为以下内容确实有效:
public toggleSelection(rockBand: RockBand): void {
const shouldSelect = !rockBand.selected;
this.rockBands.forEach(band => band.selected = false);
rockBand.selected = shouldSelect;
}
此解决方案不是最理想的,因为这需要遍历所有条目并将所选值重置为 false。 是否有另一种可能更好的方法来解决此问题?
【问题讨论】: