在我的应用程序中,有一个带有功能片的商店:
@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
为空: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);
答案 0 :(得分:1)
我遇到了这个问题,然后意识到状态的受影响部分的化简在其switch语句中没有默认情况,该语句返回了传递给化简函数的状态。如果没有这种默认情况,则reducer返回的初始状态是不确定的。添加默认状态对我来说解决了这个问题。希望这对您也有帮助。
答案 1 :(得分: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)
);
现在注销后,组件停止监听选择器。