хорошо, давайте предположим, что вы возвращаете ваши данные с сервера в виде объектов со структурой, подобной IyourAwesomeData, и для целей данного примера мы будем использовать поле someName для фильтрации данных
, поэтому компонент ur должен выглядеть так:вот так:
import { Component, OnInit, OnDestroy } from '@angular/core';
import { FormControl } from '@angular/forms';
import { startWith, debounceTime, map, switchMap, distinctUntilChanged } from 'rxjs/operators';
import { Subscription } from 'rxjs';
interface IyourAwesomeData {
someName: string;
someField: string;
someOtherField: number;
}
export class YourAutcompleteComponent implements OnInit, OnDestroy {
dataFiltered: IyourAwesomeData[]; // this data will be used inside HTML Template
data: Observable<IyourAwesomeData[]>;
yourInputCtrl = new FormControl();
private sub: Subscription;
constructor() {}
ngOnInit() {
this.data = ??? // Pass your data as Observable<IyourAwesomeData[]>;
this.sub = this.yourInputCtrl.valueChanges
.pipe(
debounceTime(500),
distinctUntilChanged(),
startWith(''),
switchMap((val) => {
return this.filterData(val || '');
})
).subscribe((filtered) => {
this.dataFiltered = filtered;
});
}
ngOnDestroy() {
this.sub.unsubscribe();
}
filterData(value: string) {
return this.data // like IyourAwesomeData[]
.pipe(
map((response) => response.filter((singleData: IyourAwesomeData) => {
return singleData.someName.toLowerCase().includes(value.toLowerCase())
})),
);
}
}
и ваш HTML шаблон должен выглядеть так:
<mat-form-field>
<input matInput placeholder="some placeholder" [matAutocomplete]="auto" [formControl]="yourInputCtrl">
<mat-autocomplete #auto="matAutocomplete">
<mat-option *ngFor="let single of dataFiltered" [value]="single.someName">
{{ single.someName }}
</mat-option>
</mat-autocomplete>
</mat-form-field>