我有一个时间滑块,可以触发操作以过滤每次更改的数据
this.selectedDate$
.pipe(
switchMap(elm => {
this.selectedTime = elm.timeSelect;
this.store.dispatch(new GetSchedulesByTime(elm.timeSelect.toString()));
return this.store.pipe(select(selectSchedulings));
})
)
.subscribe((schedules: ISchedule[]) => {
...});
GetSchedulesByTime
用新数据更新商店;
selectSchedulings
是此新数据的选择器
发生的事情是,当selectedDate
的动作被调度时,选择器仍然指向最后一个状态,因此我的处理方式失真了。
这是我的动作代码
case ESchedulesActions.GetSchedulesByTime: {
let time = action.payload;
return { ...state, actualTrips: [...(state.schedulings[time] || [])] };
}
和选择器
export const selectSchedulings = createSelector(
schedulings,
(state: ISchedulesState) => state.actualTrips
);
如何确保选择器在返回新状态之前指向新状态?
答案 0 :(得分:1)
对分发和选择的实际工作方式有一些了解。
发送 当您分派动作时,它会要求一个效果(如果存在)。效果或动作有效负载的输出直接传输到简化状态的缩减程序。
选择
选择器可帮助您选择状态的特定部分。 this.store.select
基本上会为您返回可订阅的观察对象。此订阅意味着状态发生任何变化时,都会调用您的订阅回调。
因此,您基本上需要做的是取出选择器并订阅它,如下所示:
this.scheduling$ = this.store.select(scheduleSelectors.selectSchedulings);
this.scheduling$.subscribe((data)->{
//do something with the data
//This is called everything state changes
})
因此,您不需要每次都通过管道传递选择器。只需订阅一次就足够了。在每次执行操作时,您的状态都应更改,这将依次调用上述订阅。为了验证这一事实,您可以调试代码并自行检查。