У меня есть приложение, которое отображает данные, результаты и т. Д. Из моего API на основе идентификатора сезона - этот идентификатор хранится в состоянии как свойство SeasonState:
export interface SeasonsState extends EntityState<Season> {
allSeasonsLoaded: boolean;
currentlySelectedSeasonId: number;
}
Это используется другими компонентами дляопределить, какие приборы, результаты и т. д. нужно извлечь из API и сохранить в состоянии.Например:
this.store
.pipe(
select(selectCurrentlySelectedSeason)
).subscribe(seasonId => {
this.store.dispatch(new AllFixturesBySeasonRequested({seasonId}));
this.fixtures$ = this.store
.pipe(
select(selectAllFixturesFromSeason(seasonId))
);
});
Это хорошо работает, но мне бы очень хотелось, чтобы у меня была возможность только выбирать приборы снова и снова. Светильники для этого конкретного сезона еще не сохранены в состоянии.
Я попытался создать селектор, который будет использоваться для условной загрузки данных из API в моих эффектах:
export const selectSeasonsLoaded = (seasonId: any) => createSelector(
selectFixturesState,
fixturesState => fixturesState.seasonsLoaded.find(seasonId)
);
Но я не уверен, как реализовать это / правильный ли это подход.
РЕДАКТИРОВАТЬ: используя информацию из ответа ниже, я написал следующий эффект, однако см. Комментарий - мне нужно иметь возможность использовать seasonId из полезной нагрузки в моем withLatestFrom.
@Effect()
loadFixturesBySeason$ = this.actions$
.pipe(
ofType<AllFixturesBySeasonRequested>(FixtureActionTypes.AllFixturesBySeasonRequested),
withLatestFrom(this.store.select(selectAllFixtures)), // needs to be bySeasonId
switchMap(([action, fixtures]) => {
if (fixtures.length) {
return [];
}
return this.fixtureService.getFixturesBySeason(action.payload.seasonId);
}),
map(fixtures => new AllFixturesBySeasonLoaded({fixtures}))
);