angular - Angular mat-autocomplete 不适用于函数返回的选项
问题描述
我已经从 Material 官方网站获取了自动完成示例,并将获取选项从组件类的变量更改为功能,选项显示但我无法选择任何内容,单击下拉菜单不会选择值。
<mat-autocomplete #auto="matAutocomplete">
<mat-option *ngFor="let option of options()" [value]="option">
{{option.value}}
</mat-option>
</mat-autocomplete>
export class AutocompleteSimpleExample {
myControl = new FormControl();
options(): KeyValue[] {
return [{ key: "1", value: "One" }];
}
}
interface KeyValue {
key: string;
value: string;
}
解决方案
由于函数返回ngFor的数据源,点击mat-option会触发变化检测,导致ngFor获取新数组并生成新的mat-option,导致选择无效。您可以通过使用 trackBy 功能来防止这种情况
组件.html
<mat-autocomplete #auto="matAutocomplete">
<mat-option *ngFor="let option of options();trackBy:trackByIdentity" [value]="option">
{{option.value}}
</mat-option>
</mat-autocomplete>
<!-- #enddocregion mat-autocomplete -->
</mat-form-field>
组件.ts
trackByIdentity:TrackByFunction<{key:string,value:string}> = (index: number, item: any) => item.key;
推荐阅读
- awk - AWK 过滤然后修剪输出
- angular - 访问 Angular 中动态生成的材料表中的列
- azure - 如何使用 Powershell 从 Azure Functions 获取 Azure Blob Uri?
- reactjs - 从 auth0 收到令牌后如何在 react.js 中调用/检索 getTokenSilent
- linked-list - 这个函数fun的结果是什么?
- java - 部署工件期间的 Java Web 应用程序错误
- javascript - 自动复制和重命名 Google 表格
- python - 如何在装饰器函数中打印函数默认参数?
- reactjs - 古腾堡反应:我需要在按钮单击时复制 TextControl 组件
- kubernetes - 如何在 traefik 2.2.1 中创建 tcp 服务