Эффекты NgRx Объедините действие и селектор с реквизитом - PullRequest
0 голосов
/ 17 октября 2018


Я отправляю действие и хочу обработать побочные эффекты.
Полезная нагрузка действия - id.Внутри Effect я хочу select объект с переданным id из магазина и объединить с action.
У меня проблемы с логикой Effect.

Action

export class ActionX implements Action {
  readonly type = ActionTypes.ActionX;

  constructor(public payload: { id: string }) {
  }
}

Selector

export const selectById = createSelector(
  selectState,
  (state: XState, props) => {
    let index = state.entities.findIndex(obj => obj.id === props.id);
    if (index >= 0) {
      return state.entities[index];
    }
    return undefined;
  }
);

Пока у меня есть Effect

@Effect({ dispatch: false })
  actionX$ = this.actions$
    .pipe(
      ofType<ActionX>(ActionTypes.ActionX),
      withLatestFrom((action: ActionX) => this.store.pipe(select(selectById, { id: action.payload.id }))),
      ...
    );

... - это то, где я нене знаю, что делать.
Обычно я бы делал mergeMap(([action, obj]) => // do something )), но WebStorm указывает, что [action, obj] имеет тип Observable<MyObj>, а не тип массива.

PS: у меня есть dispatch: falseпросто чтобы не выдавать ошибку, когда я выясняю, как обрабатывать операторы, я отправляю и действую с некоторой информацией из предыдущих операций.

EDIT
Теперь язнаю, что withLatestFrom не может быть функцией стрелки с параметром.
Я смог найти это в stackoverflow:

map((action: LocalSubServiceTemplateActions.LoadLocalSubService) => action.payload.globalSubServiceId),
    (globalSubServiceId) => {
        return withLatestFrom(this.store.pipe(select(fromLocalSubservices.getSearchParams(globalSubServiceId))));
    },

Но не смог обойти, поэтому следующий оператор внутритруба получает массив с [action, obj].

...