【发布时间】:2019-05-09 01:05:51
【问题描述】:
我正在关注Autocomplete Angular Material documentation(v5 设置单独的控制和显示值),但在加载数据时遇到了一些问题。
我遇到的问题是,在用户开始输入之前,我的代码中的过滤选项不会被填充。我需要在用户开始输入之前显示列表。我相信这是因为他们正在使用 valueChanges,但我不太确定如何让这段代码适合我的情况。我需要这个管道和地图功能,但我需要在用户更改 Mat Autocomplete 的值之前加载列表,而不是之后。
取自文档链接的代码或多或少反映在我自己的代码中:
<form class="example-form">
<mat-form-field class="example-full-width">
<input type="text" placeholder="Assignee" aria-label="Assignee" matInput [formControl]="myControl" [matAutocomplete]="auto">
<mat-autocomplete #auto="matAutocomplete" [displayWith]="displayFn">
<mat-option *ngFor="let option of filteredOptions | async" [value]="option">
{{ option.name }}
</mat-option>
</mat-autocomplete>
</mat-form-field>
</form>
filteredOptions: Observable<User[]>;
ngOnInit() {
this.filteredOptions = this.myControl.valueChanges
.pipe(
startWith<string | User>(''),
map(value => typeof value === 'string' ? value : value.name),
map(name => name ? this.filter(name) : this.categoryList.slice())
);
}
filter(name: string): User[] {
return this.categoryList.filter(option =>
option.name.toLowerCase().indexOf(name.toLowerCase()) === 0);
}
displayFn(user?: User): string | undefined {
return user ? user.name : undefined;
}
this.categoryList = Object.entries(data.category).map(([key, value]) => ({ key, value }));
我在想我可能应该使用某种订阅,但我无法弄清楚将它们与管道和地图一起使用的语法。
【问题讨论】:
-
你在哪里订阅可观察的?
-
您不需要订阅。我查看了您发送的链接,这里有一个完整的堆栈闪电战示例stackblitz.com/angular/… 收到焦点后,它会显示列表。根据您向我们展示的内容,我看不出有任何明显的错误。但也许你在 html 方面遗漏了一些东西。如果您发布整个示例,我们可以更好地了解可能导致它的原因。
-
@EduardoVargas 我相信它是通过异步管道完成的。我还将包含该示例的 html 代码。
-
@ccamac 我更新了代码。示例和我的代码之间的唯一区别是它们实例化“选项”数组的方式。我的选项数组是 ngOnInit 期间 API 调用后填充的“categoryList”数组。
-
@masu9 你说得对,订阅是通过异步管道完成的。至于您的 categoryList 数组,在我看来这可能是问题所在。我无法通过您此时发布的内容来判断,但该数组应该是一个空数组(即 [])以启动,然后在 api 调用中 subscribe 将其值重新分配给返回的内容。如果你这样做,它应该与示例完全相同。
标签: angular rxjs angular-material observable