4

我已经查看了关于此的另外 2 篇文章,其中包含较大状态的一篇不适用,而另一篇注册了多个 forFeature - 我已经对此进行了一些测试,即使我在之前或之后导入它forRoot(reducers) 在我的 app.module 中,它没有区别。

我确定我在配置中遗漏了一些明显的东西。

我的配置:

export const orderAdapter: EntityAdapter<IOrder> = createEntityAdapter<IOrder>({
  selectId: (order: IOrder) => order._id
});

export interface AllOrdersState extends EntityState<IOrder> {}

export const initialState: AllOrdersState = orderAdapter.getInitialState({
  ids: [],
  entities: {}
});

export const OrdersState = createFeatureSelector<AllOrdersState>('orders');

export const {
  selectIds,
  selectEntities,
  selectAll,
  selectTotal
} = orderAdapter.getSelectors(OrdersState);

我的实际减速器:


export function ordersReducer(
  state: AllOrdersState = initialState,
  action: actions.OrdersActions
) {
    case actions.CREATE_MANY: {
      console.log(action.orders);
      return orderAdapter.addMany(action.orders, state);
    }
}

我在我的 Order.Module 中注册为:

    StoreModule.forFeature('orders', ordersReducer),

我的主要减速器地图:

const reducers: ActionReducerMap<AppState> = {
  order: orderReducer,
  admin: adminReducer,
  tlabs: tlabsReducer,
  reports: reportsReducer,
  settings: settingsReducer,
  orders: ordersReducer
};

然后是app.module中的主要导入:

    StoreModule.forRoot(reducers),

尝试读取实体:

构造函数:

 private store: Store<AppState>

实际功能:

this.store
      .select(ordersReducer.selectAll)

该导入的来源:

import * as ordersReducer from '../../../../../store/reducers/orders.reducer';
4

3 回答 3

4

我在 entity.js(NGRX 实现文件)中遇到了与您类似的错误。就我而言,我有一个延迟加载的模块,它有自己的状态,最初是未定义的。由于实体选择器在获取与实体相关的字段(例如 id)之前不进行任何空值检查,因此会导致此错误。我的解决方案是避免使用orderAdapter.getSelectors(OrdersState),而是定义我自己的相当简单的受保护选择器:

export const selectIds = createSelector(selectOrderState, (state) => state?.ids);
export const selectEntities = createSelector(selectOrderState, (state) => state?.entities);
export const selectAll = createSelector(selectOrderState, (state) => (state?.ids as Array<string|number>)?.map(id => state?.entities[id]));
export const selectTotal = createSelector(selectOrderState, (state) => state?.ids?.length);

我不喜欢我没有使用内置选择器的事实,但至少这不会破坏我的代码。我希望 NGRX 团队提供一种方法来避免这种情况。

于 2020-05-11T14:12:52.327 回答
3

我遇到了这个错误,因为我使用错误的功能键设置了我的选择器:

export const selectIocState = createFeatureSelector<fromIoc.IocState>('this_key_was_wrong');

它应该与您在功能模块中加载的内容相匹配:

StoreModule.forFeature('feature_key', iocReducer),
于 2020-09-15T13:07:39.980 回答
1

看起来它正在尝试OrdersState在初始化之前读取。你的 reducer 实际上并没有返回默认状态来初始化它;至少您似乎没有,在您提供的代码中。

让你的 reducer 返回默认状态。

export function ordersReducer(
  state: AllOrdersState = initialState,
  action: actions.OrdersActions
) {
    switch(action.type) {
        case actions.CREATE_MANY: {
          console.log(action.orders);
          return orderAdapter.addMany(action.orders, state);
        }

        default: { 
          return state // Here you should return the default state
        }
    }
}
于 2019-10-02T09:54:21.433 回答