TL;DR:我已经有了可行的解决方案,但我想解释一下为什么 mat-select 会这样。
在使用 Angular Material 构建应用程序时,我在模板中mat-select
结合使用时遇到了这个错误:函数被连续调用,就像在无限循环中一样,浏览器冻结。*ngFor
get priorities
零件
get priorities() {
return [
{ name: 'NORMAL', value: 100 },
{ name: 'HIGH', value: 200 },
{ name: 'FORCE', value: 300 },
];
}
<mat-form-field appearance="outline">
<mat-label>Priority</mat-label>
<mat-select formControlName="priority">
<mat-option *ngFor="let element of priorities" [value]="element"
>{{ element.name }}</mat-option
>
</mat-select>
</mat-form-field>
可能的解决方案
- 指定每个 mat 选项(不带 ngFor)。尽管这在很多情况下都没有用。
<mat-form-field appearance="outline">
<mat-label>Priority</mat-label>
<mat-select formControlName="priority">
<mat-option [value]="priorities[0]">{{ priorities[0].name }}</mat-option>
<mat-option [value]="priorities[1]">{{ priorities[1].name }}</mat-option>
<mat-option [value]="priorities[2]">{{ priorities[2].name }}</mat-option>
</mat-select>
</mat-form-field>
- 使用原生 html 选择和选项。这是一个有效的解决方案,但我想让它与 Material 一起使用。
<select matNativeControl>
<option *ngFor="let element of priorities" [value]="element">
{{ element.name }}
</option>
</select>
- 似乎为了使用
mat-option
withngFor
我们需要添加一个trackBy
函数。¿ 有人能解释一下为什么吗?我知道使用trackby
可以提高效率,但我没有找到任何有关为什么必须将其与mat-select
.
<mat-form-field appearance="outline">
<mat-label>Priority</mat-label>
<mat-select formControlName="priority">
<mat-option
*ngFor="let element of priorities; trackBy: prioritiesTrackByFn"
[value]="element"
>{{ element.name }}</mat-option
>
</mat-select>
</mat-form-field>
prioritiesTrackByFn(index, item): number {
return item.value;
}