NgRx效果和状态管理

时间:2018-12-10 15:25:50

标签: angular ngrx

我正在尝试得出愚蠢的效果/状态方案,但我还没有完全解决这个问题。

好的,所以我应该做的是要么基于标准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问题

  1. 如何在第一个开关图之外将多个动作链接在一起?

  2. 我如何通过这些其他操作之一来更新状态?

1 个答案:

答案 0 :(得分:1)

我假设plan:Plan上有一个id字段,如果可以的话,您可以从action.payload.<id_field>进行分配:

 case PlanActionTypes.LoadSuccess: {
         return adapter.addOne(action.payload, {
           ...state,
           selectedPlanId: action.payload.planId,
         });
       }