我有以下模型片段:
nodeOrigin: types.maybe(types.reference(nodeState)),
node: types.maybe(nodeState),
然后我开始通过以下函数编辑节点(我保存了原始节点,以便可以在undo()函数中使用它):
startEditing(node) {
self.nodeOrigin = node;
self.node = clone(node);
}
在我的渲染方法中,编辑节点的用法如下:
<form className="form">
<TextField margin='dense' value={getStore().node["name"]} />
</form>
但是当我更改名称并打印节点和原始节点的内容时,它们都具有更改的名称。 NodeOriginal应该包含原始名称。我在做什么错了?
答案 0 :(得分:1)
types.reference
is tied to types.identifier
。您在这里可能会误会的是,types.reference
引用给定节点的types.identifier
属性,而不是节点本身。
clone
时,您不会更改原始节点的id
。 types.reference
由给定的id
即时从标识符缓存中解析,因此它将始终引用给定id
的节点。
此外,鉴于id不能在初始化后更改,并且它在整个节点树中应该是唯一的,所以我得出结论,具有types.identifier
属性的节点不打算用clone
克隆。实用程序。
或者,您可以为要克隆的节点拍摄快照,手动更新types.identifier
属性,然后从中创建一个新节点。像这样:
const cloneWithNewId = (node, id) =>
getType(node).create(Object.assign({}, getSnapshot(node), { id }));