#angular #rxjs #observable #resolver
#angular #rxjs #наблюдаемый #распознаватель
Вопрос:
У меня есть распознаватель на странице для загрузки данных. Этот преобразователь возвращает Observable<Product[]>
Затем я объединяю поток из преобразователя с другим потоком, используя combineLatest.
Но проблема в том, что когда я объединяю потоки, я получаю сообщение об ошибке, в котором говорится, что мои потоки используются до инициализации. Я попытался поместить combineLatest в функцию и вызвать ее после получения данных из преобразователя. Затем у меня появляется сообщение об ошибке «фильтр не является функцией» для продуктов.вызов фильтра в combineLatest.
categorySelectedSubject = new Subject<number>();
categorySelectedAction$ = this.categorySelectedSubject.asObservable();
ngOnInit(): void {
this.productsWithCategoriesResolved$ = this.route.snapshot.data["resolvedData"]
}
this.filteredByCategoryProducts$ = combineLatest([
this.productsWithCategoriesResolved$,
this.categorySelectedAction$
.pipe(
startWith(0)
)
])
.pipe(
map(([products, selectedCategoryId]) =>
products.filter(p => selectedCategoryId ? p.categoryId === selectedCategoryId : true)
),
catchError(err => {
this.errorMessage = err;
return EMPTY;
})
);
onCategorySelected(categoryId: string){
this.categorySelectedSubject.next( categoryId)
}
Большое спасибо за любую помощь или предложения.
Комментарии:
1. похоже, вы могли бы сделать просто
this.productsWithCategoriesResolved$.pipe(filter(Boolean))
.
Ответ №1:
combineLatest
оператору требуются все наблюдаемые, и когда все наблюдаемые выдают значение хотя бы одно, он вызывает subscribe . Здесь у вас есть this.route.snapshot.data["resolvedData"]
коллекция продуктов ( Product[]
).
Вы должны преобразовать filteredByCategoryProducts$
для хранения наблюдаемого Product[]
, просто добавив of
оператор для преобразования потока.
import { combineLatest, of } from 'rxjs';
this.filteredByCategoryProducts$ = of(this.route.snapshot.data["resolvedData"]);
Комментарии:
1. Да! Большое спасибо Панкадж Паркар! Это работает! Я всего лишь новичок в наблюдаемых, так что еще раз спасибо!
Ответ №2:
Используйте данные, наблюдаемые в Activatedroute, вместо snapshot.data. Затем с помощью rxjs pluck operator вы можете извлечь нужные данные.
this.productsWithCategoriesResolved$ = this.route.data.pipe(pluck('resolvedData'));