@ngrx/entity `与 @ngrx/store 一起使用时无法读取未定义的属性“ids”?定义适配器时已考虑自定义 ID

Mic*_*elB 6 ngrx angular ngrx-store ngrx-entity angular8

我已经查看了与此相关的另外 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);
Run Code Online (Sandbox Code Playgroud)

我的实际减速器:


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

我在 Order.Module 中注册为:

    StoreModule.forFeature('orders', ordersReducer),
Run Code Online (Sandbox Code Playgroud)

我的主要减速器图:

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

Run Code Online (Sandbox Code Playgroud)

然后在app.module中主要导入:

    StoreModule.forRoot(reducers),
Run Code Online (Sandbox Code Playgroud)

尝试读取实体:

构造函数:

 private store: Store<AppState>
Run Code Online (Sandbox Code Playgroud)

实际功能:

this.store
      .select(ordersReducer.selectAll)
Run Code Online (Sandbox Code Playgroud)

导入的来源:

import * as ordersReducer from '../../../../../store/reducers/orders.reducer';
Run Code Online (Sandbox Code Playgroud)

Hel*_*ate 5

我遇到此错误是因为我使用错误的功能键设置选择器:

export const selectIocState = createFeatureSelector<fromIoc.IocState>('this_key_was_wrong');
Run Code Online (Sandbox Code Playgroud)

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

StoreModule.forFeature('feature_key', iocReducer),
Run Code Online (Sandbox Code Playgroud)


Kor*_*rte 2

OrdersState看起来它正在尝试在初始化之前读取。您的减速器实际上并不返回默认状态以对其进行初始化;而是返回默认状态。至少在您提供的代码中您似乎没有这样做。

让你的减速器返回默认状态。

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)