Эффекты NgRx и государственное управление - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь отработать следующий сценарий Эффект / Состояние, и я не совсем обдумал это.

Хорошо, так что я должен либо загрузить данные, основанные на стандарте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));
      })
);

Я понимаю, что мне не хватает в редуктор / состояние.Итак, давайте посмотрим на это.

СНИЖЕНИЯ:

 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;
   }

Когда я использую действие Load, я устанавливаю selectedStateId в редуктор.Таким образом, имеет смысл, почему selectedStateid имеет значение null для LoadSuccess, когда я использую действие LoadBypropNum, но имеет значение при использовании действия Load.Однако, когда я вызываю LoadByPropnum - , у меня еще нет идентификатора! .

ЦЕЛЬ : Я хотел бы обновить архитектуру так, чтобы у меня был промежуточный шаг для LoadPlanByProperty $, посредством которого я обновляю State SelectedPlanId, как только я получу данные.В настоящее время LoadPlan $ Effect и LoadPlanByProperty $ Effect извлекают одну и ту же запись, используя разные столбцы, и оба успешно.Я не хочу получать данные, использовать идентификатор, чтобы снова получить те же данные.

ВОПРОСЫ TL / DR

  1. Как связать несколько действий вместе за пределами первой карты переключения?

  2. Как обновить состояние одного из этих дополнительных действий?

1 Ответ

0 голосов
/ 10 декабря 2018

Я предполагаю, что plan:Plan имеет поле id, если вы можете назначить его из action.payload.<id_field>:

 case PlanActionTypes.LoadSuccess: {
         return adapter.addOne(action.payload, {
           ...state,
           selectedPlanId: action.payload.planId,
         });
       }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...