NGRX实际上从参数化选择器中获取状态

时间:2018-10-13 00:44:47

标签: angular ngrx ngrx-effects

背景

我有一个用于搜索的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] => (/* ... */))
);

我还尝试过使用直接使用this.store.select的mergeMap,但它导致了无限循环,因为这种效果最终会修改状态,从而触发mergeMap中的选择器。

那么我将如何获得要在此效果中使用的搜索状态的特定实例? (我想我也会接受这样的答案:如果有更好的方法来表示相同状态类型的不同实例,那么整个实例的想法是错误的。)

1 个答案:

答案 0 :(得分:0)

在尝试访问include <stdio.h> include <stdlib.h> int main(int argc, char *argv[]) { int x, y, z; printf("Enter value for x: "); scanf("%d", &x); if(x < 1) { printf("Invalid value\n"); exit(1); } printf("Enter value for y: "); scanf("%d", &y); if(y < 1); { printf("Invalid value\n"); } printf("Enter value for z: "); scanf("%d", &z); if(z < 1); { printf("Invalid value\n"); exit(1); } int lhs = x * x + y * y; int rhs = z * z; if(lhs == rhs) { printf("Right angled triangle\n"); } else { printf("%d is not right angled and equal %d\n", lhs, rhs ); } 中的操作时,我遇到了完全相同的问题,这就是我的解决方法:

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] => (/* ... */)) ,否则该代码将挂起我的经验,它只是从Parameterized Selector中获取值。它没有它就挂起了,因为我认为take(1)等待所有可观察对象完成,并且forkJoin进行一次发射然后完成。