Я новичок в разработке 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)))
)
)