Вы не возвращаете наблюдаемое все до async
трубы. Вместо этого вы выполняете ручную подписку и отображаете результаты.
filterFunction() {
this.countries = this.filter.valueChanges.pipe(
startWith(''),
switchMap(text => this.search(text))
);
}
search(text: string): Observable<any[]> {
return this.sampleFunction().pipe(
map(countries => {
return countries.filter(country => {
const term = text.toLowerCase();
return country.caseID.toLowerCase().includes(term)
|| (country.word).toLowerCase().includes(term)
|| (country.product).toLowerCase().includes(term);
});
});
);
}
sampleFunction(): Observable<any[]> {
return this.extractorService.dbFirestore().pipe(
map(data => data.map(x => x.payload.doc.data()))
);
}
Я бы порекомендовал добавлять типы возвращаемых данных в функции везде, где это возможно, Typescript отлично подходит для поиска небольших ошибок на основе типов, таких как:
Одна потенциальная проблема сейчас заключается в том, что this.extractorService.dbFirestore()
будет вызываться каждый раз, когда изменяется значение фильтра. Если вы не хотите, чтобы это произошло, вам нужен другой подход.
Работа со стати c data
Возможно, вы просто хотите сначала загрузить данные, а затем отфильтровать фиксированный массив. В этом случае вы сначала загрузите данные, а затем объедините изменения значений с помощью concatMap
.
filteredCountries$: Observable<any[]>;
private countries: any[];
filterFunction() {
// load the countries first
this.filteredCountries$ = this.getCountries().pipe(
// set the countries
tap(countries => this.countries = countries),
// now start observing the filter changes
concatMap(countries => {
return this.filter.valueChanges.pipe(
startWith(''),
map(text => this.search(text))
})
);
}
search(text: string): any[] {
return countries.filter(country => {
const term = text.toLowerCase();
return country.caseID.toLowerCase().includes(term)
|| (country.word).toLowerCase().includes(term)
|| (country.product).toLowerCase().includes(term);
});
}
getCountries(): Observable<any[]> {
return this.extractorService.dbFirestore().pipe(
map(data => data.map(x => x.payload.doc.data()))
);
}
Тогда ваш HTML будет наблюдать filteredCountries$
вместо countries
.
<tr *ngFor="let item of filteredCountries$ | async">