4

在我的应用程序中有一个带有特征切片的商店:

@NgModule({
    imports: [
    CommonModule,
    TranslateModule.forChild({}),
    StoreModule.forFeature('slice', slice)
    ...
})

特征的 Reducer Map:

export const slice: ActionReducerMap<SliceState> = {
    someReducer
};

和特征选择器:

export const selectSliceModule = createFeatureSelector<SliceState>('slice');
export const selectItem = createSelector(selectSliceModule,
(state: SliceState) => state.someReducer.paramA);

有一个注销操作,在注销后清除主存储,slice注销后也是如此slice === null

使用选择器订阅特征存储切片的组件selectItem 然后失败,因为state.someReducer它是 null: state.someReducer.paramA

我的问题是:在这种情况下可以在选择器中使用三元运算符吗?它会破坏选择器记忆吗?或者有没有更好的方法来处理这种情况?

// Is it OK to have ternary operator in selector?
export const selectItem = createSelector(selectSliceModule,
(state: SliceState) => state.someReducer ? state.someReducer.paramA : null);
4

2 回答 2

1

我遇到了这个问题,然后意识到我的状态受影响部分的减速器在其 switch 语句中没有默认情况,它返回传递给减速器函数的状态。如果没有这种默认情况,reducer 返回的初始状态是未定义的。添加默认状态为我解决了这个问题。希望这对您也有帮助。

于 2018-06-19T19:27:13.373 回答
0

我知道这个问题很老,但也许这可以帮助某人。

面临同样的问题,这是因为我的组件在销毁后试图访问数据。

添加takeUntil解决了我的问题

this.restaurantData$ = this.restaurantQuery$
      .pipe(
        takeUntil(this._ngOnDestroy), // Added this line
        filter((restaurantQuery) => !!restaurantQuery),
        switchMap((restaurantQuery) => restaurantQuery.valueChanges),
        map((response) => response.data.vendor)
      ); 

现在注销后,组件停止侦听选择器。

于 2019-02-06T11:41:34.270 回答