我有以下模型片段:
nodeOrigin: types.maybe(types.reference(nodeState)),
node: types.maybe(nodeState),
我开始通过以下函数编辑节点(我保存的原始节点可以在undo()函数中使用):
startEditing(node) {
self.nodeOrigin = node;
self.node = clone(node);
}
在我的render方法中,编辑节点的使用方式如下:
<form className="form">
<TextField margin='dense' value={getStore().node["name"]} />
</form>
但是当我更改名称并打印节点和原始节点的内容时,它们都具有更改的名称。 NodeOriginal应包含原始名称。我究竟做错了什么?
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 }));