ngrx - передача полезной нагрузки запускающего действия следующему действию - PullRequest
0 голосов
/ 11 февраля 2020

Я новичок в разработке ngrx и Angular. У меня есть коллекция сделок в моем магазине. Эффект прослушивает LoadTradeRequest, который запускает http-запрос для получения Observable и запускает LoadTradeSuccess или LoadTradeFailure.

@Effect()
loadTrade$: Observable<Action> = this.actions$.pipe(
ofType(ActionTypes.LoadTradeRequest),
mergeMap((action: actions.LoadTradeRequest) =>
  this.remoteApiService.loadTrade(action.payload).pipe(
    map(trade => new actions.LoadTradeSuccess(trade)),
    catchError(err => of(new actions.LoadTradeFailure(err)))
  )
 )
);

Функция редуктора для действия LoadTradeSuccess добавляет загруженную сделку в магазин.

  case ActionTypes.LoadTradeSuccess: {
  return { ...state, trades: [...state.trades, action.payload] };
}

Моя декларация штата:

trades: Trade[];

Пока все работает нормально. Теперь мне нужно изменить состояние, чтобы сделать коллекцию сделок, основанную на уникальном идентификаторе, который указан в полезной нагрузке действия LoadTradeRequestAction

Желаемое состояние

trades: DictionaryItem<string, Trade>[];

, где DictionaryItem -

export interface DictionaryItem<K, V> { 0: K; 1: V; }

Как передать свойство действия, которое вызывает эффект, к действию, которое оно запускает вместе с ответом http. Блок ниже не работает и просто пытается проиллюстрировать то, чего я хочу достичь.

@Effect()
loadTrade$: Observable<Action> = this.actions$.pipe(
ofType(ActionTypes.LoadTradeRequest),
mergeMap((action: actions.LoadTradeRequest) =>
this.remoteApiService.loadTrade(action.payload).pipe(
map(trade => new actions.LoadTradeSuccess({**action.payload.UniqueIdentifier**, trade})),
catchError(err => of(new actions.LoadTradeFailure(err)))
 )
)

1 Ответ

1 голос
/ 11 февраля 2020

Конструктор вашего действия должен получить два параметра:

class LoadTradeSuccess {
  constructor(readonly id: any, readonly  trade: any){}
}

Или объект полезной нагрузки, но затем вы должны создать объект с эффектом

class LoadTradeSuccess {
  constructor(readonly payload: any){}
}


map(trade => new actions.LoadTradeSuccess({id: action.payload.UniqueIdentifier, trade: trade })),
...