我正在尝试得出愚蠢的效果/状态方案,但我还没有完全解决这个问题。
好的,所以我应该做的是要么基于标准ID(基本上是计划表中的标识列)加载数据,要么基于已知的公司标识符加载数据。
我有以下
动作
export class Load implements Action {
readonly type = PlanActionTypes.Load;
constructor(public payload: number) {}
}
export class LoadByPropNum implements Action {
readonly type = PlanActionTypes.LoadByPropNum;
constructor(public payload: string) { }
}
export class LoadSuccess implements Action {
readonly type = PlanActionTypes.LoadSuccess;
constructor(public payload: Plan) {
}
}
效果:
此效果按预期起作用:
@Effect()
loadPlan$: Observable<Action> = this.actions$
.ofType<Load>(PlanActionTypes.Load).pipe(
switchMap(action => this.planService.getPlan(action.payload)),
map((plan: Plan) => {
return new LoadSuccess(plan);
}),
catchError(err => {
toastr.error(`Could not load plan.`);
console.error(err);
return of(new LoadFail(err));
})
);
这不是。
@Effect()
loadPlanByProperty$: Observable<Action> = this.actions$
.ofType<LoadByPropNum>(PlanActionTypes.LoadByPropNum)
.pipe(
switchMap(action => this.planService.getPlanByProperty(action.payload)),
map((plan: Plan) => {return new LoadSuccess(plan);} ),
catchError(err => {
toastr.error(`Could not load plan.`);
console.error(err);
return of(new LoadFail(err));
})
);
我知道我缺少的是在reducer / state中。因此,让我们看一下。
减速机:
case PlanActionTypes.LoadSuccess: {
return adapter.addOne(action.payload, {
...state,
selectedPlanId: state.selectedPlanId,
});
}
case PlanActionTypes.Load: {
return {
...state,
selectedPlanId: action.payload,
};
}
状态:
export interface State extends EntityState<Plan> {
selectedPlanId: number | null;
}
当我使用“加载操作”时,我在减速器中设置了selectedStateId。因此,当我使用LoadBypropNum操作时,为什么LoadSuccess的selectedStateid为null却是合理的,而使用Load操作时却具有一个值。但是,当我调用LoadByPropnum-我还没有ID!。
目标:我想更新架构,以便在LoadPlanByProperty $的中间步骤中,一旦检索到数据,便更新State SelectedPlanId。当前,LoadPlan $效果和LoadPlanByProperty $效果使用不同的列检索相同的记录,并且两者均成功。我不想去获取数据,使用id来再次获取相同的数据。
TL / DR问题
如何在第一个开关图之外将多个动作链接在一起?
我如何通过这些其他操作之一来更新状态?
答案 0 :(得分:1)
我假设plan:Plan
上有一个id字段,如果可以的话,您可以从action.payload.<id_field>
进行分配:
case PlanActionTypes.LoadSuccess: {
return adapter.addOne(action.payload, {
...state,
selectedPlanId: action.payload.planId,
});
}