我正在尝试使用 Angular 5 Material 的自动完成功能创建一个客户(或任何东西)的下拉列表。但与 Angular 网站上提供的示例不同,我的数据不是静态的,而是在数据调用之后返回的getAllCustomer()
。
我遇到的问题似乎是filterOptions
在数据从我的getAllCustomer()
方法返回之前分配。
如何确保仅filterOptions
在我的数据返回后分配我的?
这是我的代码:
filteredOptions: Observable<string[]>;
constructor(private loadDataService: LoadDataService, private assetDataService: AssetDataService, private router: Router, private toastr: ToastrService) { }
ngOnInit() {
this.getAllCustomers();
this.filteredOptions = this.myCustomerSearchControl.valueChanges.pipe(
startWith(''),
map(val => this.filter(val))
);
}
filter(val: string): string[] {
return this.customerArray.filter(option => option.toLowerCase().indexOf(val.toLowerCase()) === 0);
}
getAllCustomers() {
this.loadDataService.getAllCustomers()
.subscribe(data => {
this.customerArray = data;
});
}
这是我的 HTML:
<mat-form-field>
<input type="text" placeholder="Customer Search" aria-label="Number" matInput [formControl]="myCustomerSearchControl" [matAutocomplete]="auto">
<mat-autocomplete autoActiveFirstOption #auto="matAutocomplete">
<mat-option *ngFor="let option of filteredOptions | async" [value]="option">
{{ option }}
</mat-option>
</mat-autocomplete>
</mat-form-field>
作为奖励,我如何能够实现相同的功能,但使用实际的搜索功能返回用户在搜索框中键入的数据 - 即按字符串方法搜索?
这是我的searchByString
功能:
searchForCustomerByString(string) {
this.loadDataService.getCustomer(string)
.subscribe(data => {
this.returnedCustomers = data;
});
}