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 但页面正在中断。
- 无法添加属性xxx,对象不可扩展
- 无法分配给对象“[object Object]”的只读 属性 xxx
问题与Angular无关,是NGRX版本升级问题
store 对象是 readonly 所以任何在 action,reducer,effect 和 selector 中存储数据的更新都会抛出类似的错误提到
解决这个问题:
- 如果需要,我们总是需要从选择器发送一个新的引用
对中的对象执行任何类型的 update/assignment 操作
组件。
- 避免对有效负载进行任何类型的更新
store(action/effect/reducer) 在组件中进行更改。
- 如果我们
想要对有效载荷进行任何修改并在 reducer/effect 中使用它
取一个新的参考。
要创建新参考,您可以使用
...运算符(嵌套对象的技巧)
JSON.parse(JSON.stringfy(数据))(嵌套对象和所有类型的不完全证明)
Object.assign({}, obj);
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 了解更多信息
升级 Angular 4 到 10 和 NGRX 版本(到 v 9)后,我在尝试执行任何操作时遇到多个错误。
每次进行 http 调用时,我的应用程序都会中断。
我遇到以下错误,有时没有 errors/warnings 但页面正在中断。
- 无法添加属性xxx,对象不可扩展
- 无法分配给对象“[object Object]”的只读 属性 xxx
问题与Angular无关,是NGRX版本升级问题
store 对象是 readonly 所以任何在 action,reducer,effect 和 selector 中存储数据的更新都会抛出类似的错误提到
解决这个问题:
- 如果需要,我们总是需要从选择器发送一个新的引用 对中的对象执行任何类型的 update/assignment 操作 组件。
- 避免对有效负载进行任何类型的更新 store(action/effect/reducer) 在组件中进行更改。
- 如果我们 想要对有效载荷进行任何修改并在 reducer/effect 中使用它 取一个新的参考。
要创建新参考,您可以使用
...运算符(嵌套对象的技巧)
JSON.parse(JSON.stringfy(数据))(嵌套对象和所有类型的不完全证明)
Object.assign({}, obj);
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 了解更多信息