Angular 10 - NGRX 升级问题:无法添加 属性 x 对象不可扩展且无法分配给对象的只读 属性 x

Angular 10 - NGRX Upgrade Issues : Cannot add property x object is not extensible and Cannot assign to read only property x of object

升级 Angular 4 到 10 和 NGRX 版本(到 v 9)后,我在尝试执行任何操作时遇到多个错误。

每次进行 http 调用时,我的应用程序都会中断。

我遇到以下错误,有时没有 errors/warnings 但页面正在中断。

  1. 无法添加属性xxx,对象不可扩展
  2. 无法分配给对象“[object Object]”的只读 属性 xxx

问题与Angular无关,是NGRX版本升级问题

store 对象是 readonly 所以任何在 action,reducer,effect 和 selector 中存储数据的更新都会抛出类似的错误提到

解决这个问题:

  1. 如果需要,我们总是需要从选择器发送一个新的引用 对中的对象执行任何类型的 update/assignment 操作 组件。
  2. 避免对有效负载进行任何类型的更新 store(action/effect/reducer) 在组件中进行更改。
  3. 如果我们 想要对有效载荷进行任何修改并在 reducer/effect 中使用它 取一个新的参考。

要创建新参考,您可以使用

  1. ...运算符(嵌套对象的技巧)

  2. JSON.parse(JSON.stringfy(数据))(嵌套对象和所有类型的不完全证明)

  3. Object.assign({}, obj);

  4. cloneDeep(如果您使用的是 lodash)或将自定义方法写入深度克隆对象

此外,您可能会遇到一些语法错误,请使用 link

https://ngrx.io/guide/migration 并阅读您要迁移的版本的指南

https://ngrx.io/guide/migration/v8

解决方法: 在之前的 NgRx 版本中,运行时不变性检查是可选的。在版本 9 及更高版本中,不变性运行时检查默认打开。

所以你可以将它设置为 false :

@NgModule({
  imports: [
    StoreModule.forRoot(reducers, {
      runtimeChecks: {
        strictStateImmutability: false,
        strictActionImmutability: false,
      },
    }),
  ],
})
export class AppModule {}

您的代码将像以前一样工作,但这不是正确的解决方案。

使用此 link 了解更多信息

https://medium.com/ngrx/announcing-ngrx-version-9-immutability-out-of-the-box-customizable-effects-and-more-e4cf71be1a5b