微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NgRx 类型错误:实体不可迭代

如何解决NgRx 类型错误:实体不可迭代

我一直在尝试按照 Angular University 代码的指南在我的应用程序中实现 ngrx 状态管理,因此我正在尝试将课程存储库 (https://github.com/angular-university/ngrx-course/tree/2-entity-finished/src/app/courses) 中的方法应用于我的应用程序。

此时,我已经正确调用了所有操作,通过查看 ngrx 开发工具,我的 global 负载到达客户端,但随后应用程序因 ERROR TypeError: entities is not iterable 而中断,并且它没有t 被存储,所以我正在寻找一些帮助来找出这里出了什么问题,我怀疑是在减速器中,但我缺乏经验并没有让我找到问题。

效果

  loadStats$ = createEffect(() =>
    this.actions$.pipe(
      ofType(StatsActions.loadGlobalStats),switchMap((action) => this.service.getData()),tap(console.log),map((global) => {
        return globalStatsLoaded({ global });
      })
    )
  );

动作:

export const loadGlobalStats = createAction(
  '[Global Stats Resolver] Load Global Stats'
);

export const globalStatsLoaded = createAction(
  '[Load Global Stats Effect] Global Stats Loaded',props<{ global: IOccurrence[] }>()
);

减速器:

export const statsAdapter = createEntityAdapter<IStats>();

const initialState = statsAdapter.getinitialState({
  global: [],countries: [],globalStatsLoaded: false,currentCountry: null,});

export const statsReducer = createReducer<Statsstate>(
  initialState,on(StatsActions.globalStatsLoaded,(state,{ global }) => {
    return { ...state,globalStatsLoaded: true,global };
  })

感谢您的帮助。

解决方法

既然您使用的是 EntityAdapter,那么您也应该使用 collection methods。来自文档:

实体适配器还提供对实体进行操作的方法。这些方法可以一次更改一个到多个记录。如果进行了更改,每个方法都返回新修改的状态,如果没有进行更改,则返回相同的状态。

在你的情况下,在你的 reducer 中尝试这样的事情:

on(StatsActions.globalStatsLoaded,(state,{ global }) => {
    return statsAdapter.upsertOne(global,state);
})

希望,这有帮助:-)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。