NGRX Получить состояние из параметризованного селектора в действии - PullRequest
0 голосов
/ 13 октября 2018

Фон

У меня есть хранилище NGRX для поиска следующим образом:

export interface State {
   field: string;
   operator: string;
   criteria: string;
   offset: number;
   limit: number;
}

И так как у меня многократное использование поиска, я создаю несколько экземпляров этого состояния поиска в своем основном состоянии.объект:

// In index.ts
export interface State {
    search: {
        main: searchReducer.State;
        other: searchReducer.State;
    };
}

И параметризованный селектор, чтобы получить правильный:

export const chooseSearchInstance = (instance: string): ((state: State) => searchReducer.State) => {
    switch(instance) {
        case 'MAIN': {
            return getMainSearchState;
        }
        case 'OTHER': {
            return getOtherSearchState;
        }
    }
};

Вопрос

Я пытаюсь реализовать некоторые нумерации страниц в поиске, поэтому мне нужноиспользовать вышеупомянутый селектор в Эффекте, чтобы узнать, является ли это тем же самым поиском или нет.Однако, поскольку «withLatestFrom» принимает только дополнительный источник Observable, а не обратный вызов, я не уверен, как бы я указал его в Effect? ​​

@Effect()
public searchItems: Observable<Action> = this.actions.pipe(
    ofType<searchActions.PerformSearchAction>(searchActions.PERFORM_SEARCH),
    withLatestFrom(this.store.select(rootReducers.chooseSearch( action.payload.instance)),   // <-- Cannot do this since there is no access to action at this point.
    switchMap(([action, searchState] => (/* ... */))
);

Я также попытался использовать mergeMap, который использовал this.store.select, но это вызвало бесконечный цикл, потому что этот эффект приводит к изменению состояния, которое вызывает селектор в mergeMap.

Так как же мне получить конкретный экземпляр состояния поиска для использования в этом эффекте?(Полагаю, я также приму ответы, в которых говорится, что вся эта идея экземпляра неверна, если есть лучший способ представить разные экземпляры одного и того же типа состояния).

1 Ответ

0 голосов
/ 13 октября 2018

У меня была точно такая же проблема при попытке получить доступ к действию в withLatestFrom, вот как я обошел его:

// Same as withLatestFrom but used mergeMap/forkJoin because of use of action.payload
mergeMap((action) => forkJoin(
  of(action),
  this.store.pipe(select(rootReducers.chooseSearch(action.payload.instance)), take(1)),
)),
switchMap([action, searchState] => (/* ... */))

Обратите внимание на использование take(1), иначе код будет зависать в моемопыт, он просто берет значение из параметризованного селектора.Он зависает без него, потому что я думаю, что forkJoin ожидает завершения всех наблюдаемых, а take(1) берет один выброс и затем завершает.

...