csi*_*sim 5 javascript ngrx angular immer.js
我正在尝试更新我的一个对象上的嵌套道具,我相信根据文档,它应该完全像那样工作。只是需要明确的是,该州有一个课程列表,每个课程都有一个模块列表,并且相关模块有一个我正在尝试设置的属性。
on(setBootstrapScript, (state, action) => {
return produce(state, (draft) => {
const index = draft.lessons[action.lessonId].modules.findIndex(
(module) => module.uuid === action.moduleId,
);
if (index !== -1) {
draft.lessons[action.lessonId].modules[
index
].bootstrapScript = action.bootstrapScript;
}
});
})
Run Code Online (Sandbox Code Playgroud)
注意:我知道有类似
ngrx-etc或 之ngrx-immer类的实用程序具有mutableOn功能,但这不是这里的问题。它应该仍然像这样工作。
在这样的测试中使用它时效果很好
test('setBootstrapScript should set the correct database bootstrap script', async () => {
let results = reducer(
initialState,
setBootstrapScript({
lessonId: 0,
moduleId: 1,
bootstrapScript: 'CREATE NEW TABLE;',
}),
);
expect(results.lessons[0].modules[0]).toEqual(
expect.objectContaining({
bootstrapScript: 'CREATE NEW TABLE;',
}),
);
});
Run Code Online (Sandbox Code Playgroud)
但在浏览器中使用它会导致
core.js:6210 ERROR TypeError: Cannot assign to read only property 'bootstrapScript' of object '[object Object]'
Run Code Online (Sandbox Code Playgroud)
我不确定我到底做错了什么,因为 immer 应该允许我像这样更新状态。由于浸入器会关闭自动冷冻功能,因此它在生产中运行良好。由于某种原因,模块(或模块的属性)被设置为 writable false。
任何指点将不胜感激,谢谢。
| 归档时间: |
|
| 查看次数: |
550 次 |
| 最近记录: |