У меня есть this.selectedFilters$
- это значение должно быть изменено, когда this.filter$
(инициализация) или this.newFilter$
испускают любое значение.Вот почему я использовал слияние.
Поэтому, когда this.newFilter$
испускает любое значение, мне нужно обновить CURRENT OBJECT на основе данных из this.newFilter$
.Однако я понятия не имею, как я могу правильно получить это текущее значение из this.selectedFilters$
Я пытался использовать withLatestFrom(this.selectedFilters$)
, но компилятор не будет работать, поскольку в начале this.selectedFilters$
просто пустой до инициализации.
Пока что я решил это, сохранив текущее значение в локальной переменной this.currentFilters
, используя tap()
- но я знаю, что это плохая практика, по крайней мере, пока это работает ... Как я могу решить это лучше?
this.selectedFilters$ = merge(
this.filter$.pipe(
switchMap((allFilters) => {
return of({
itemId: allFilters[0].itemId,
filterOptions: this.getDefaultFilterOptions(allFilters)
});
}),
),
this.newFilter$.pipe(
switchMap((newFilter: FilterOption) => {
return of(this.getNewFilterOptions(newFilter, this.currentFilters));
}),
)
).pipe(tap((filters) => this.currentFilters = filters));
}
// LESS IMPORTANT CODE BELOW...
private getNewFilterOptions(newFilter: FilterOption, currentFilters: ItemFilter): ItemFilter {
const changedFilter = currentFilters.filterOptions.findIndex(f => f.filterId === newFilter.filterId);
currentFilters.filterOptions[changedFilter] = newFilter;
return currentFilters;
}
private getDefaultFilterOptions(filters: ItemFilter[]): FilterOption[] {
return filters.reduce((acc, item) => acc.concat(item.filterOptions[0]), []);
}