Material Autocomplete 教學 - slioplark/angular-tutorial GitHub Wiki
使用 matAutocomplete 屬性建立 template variable ( #auto ),以連結 mat-autocomplete 標籤,使 input 標籤可取得 user$
資料。
<mat-form-field>
<input type="text" matInput [matAutocomplete]="auto">
<mat-autocomplete #auto="matAutocomplete" [displayWith]="displayUserFn">
<mat-option *ngFor="let item of users$ | async" [value]="item">
{{ item }}
</mat-option>
</mat-autocomplete>
</mat-form-field>
<section [formGroup]="form">
<input type="text" formControlName="user">
</section>
constructor(
private formBuilder: FormBuilder
) { }
form = this.formBuilder.group({
user: [null]
});
this.form.get('user').valueChanges.pipe(
map(value => result.filter(item =>
item.toLowerCase().includes(value.toLowerCase())
)
);
若 value 屬性綁定的 item 是一個 object
型別,則頁面上呈現的資料會以 { }
格式顯示,為了希望以 string
型別出現在 input 上,則需使用 displayWith 屬性以設定顯示在頁面上的 value。
<mat-autocomplete #auto="matAutocomplete" [displayWith]="displayUserFn">
<mat-option *ngFor="let item of users$ | async" [value]="item">
{{ item.name }}
</mat-option>
</mat-autocomplete>
displayUserFn(item) {
return item ? item.name : undefined;
}
在 filter 前,需判斷 value 的型別是否為 string,否則後面無法對非 string 的變數進行 toLowerCase() 以發生無法預期的錯誤。
由於 autocomplete value 現在綁定的是 object,因此很有可能傳進一個非 string 的 value
this.form.get('user').valueChanges.pipe(
map(value => typeof value === 'string' ? value : value.name),
map(value => result.filter(item =>
item.toLowerCase().includes(value.toLowerCase())
)
);