Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何应用不同类型的快照?_Javascript_Mobx State Tree - Fatal编程技术网

Javascript 如何应用不同类型的快照?

Javascript 如何应用不同类型的快照?,javascript,mobx-state-tree,Javascript,Mobx State Tree,我在我的应用程序中使用不同类型的“待办事项”模型。这些类型通过一个名为“type”的字段实现 我的问题:当我想通过对对象应用快照将我的步骤类型从“清理”更改为“购物”时,我得到了错误: 。。。路径“/type”值“shopping”不可分配给类型:“cleaning” 有没有关于如何实现我的用例的提示 我创建了一个codesandbox示例,说明如何更改类型(只需单击按钮): 不幸的是,我无法在控制台中显示错误。我认为不可能直接更改子对象的类型,因为您实际上需要一个新的模型实例,因此todos

我在我的应用程序中使用不同类型的“待办事项”模型。这些类型通过一个名为“type”的字段实现

我的问题:当我想通过对对象应用快照将我的步骤类型从“清理”更改为“购物”时,我得到了错误:

。。。路径“/type”值“shopping”不可分配给类型:“cleaning”

有没有关于如何实现我的用例的提示

我创建了一个codesandbox示例,说明如何更改类型(只需单击按钮):


不幸的是,我无法在控制台中显示错误。

我认为不可能直接更改子对象的类型,因为您实际上需要一个新的模型实例,因此todos数组也必须更新其引用

因此,您需要做的是将todo替换为todo:

export const TodoStore = types
  .model("TodoStore", {
    todos: types.array(Todo),
  })
  .actions(self => ({
    changeToShoppingType: (todo) => {
      const snap = getSnapshot(todo);
      console.log("snapshot: ", snap);
      const newSnap = {};
      Object.assign(newSnap, snap, { type: "shopping" });

      console.log("newSnap: ", newSnap);
      self.todos.splice(self.todos.indexOf(todo), 1, newSnap);
    }
  }));
检查这个例子

export const TodoStore = types
  .model("TodoStore", {
    todos: types.array(Todo),
  })
  .actions(self => ({
    changeToShoppingType: (todo) => {
      const snap = getSnapshot(todo);
      console.log("snapshot: ", snap);
      const newSnap = {};
      Object.assign(newSnap, snap, { type: "shopping" });

      console.log("newSnap: ", newSnap);
      self.todos.splice(self.todos.indexOf(todo), 1, newSnap);
    }
  }));