Mobx-state-tree Clone также меняет оригинальный элемент? - PullRequest
1 голос
/ 10 марта 2019

У меня есть следующий фрагмент модели:

nodeOrigin: types.maybe(types.reference(nodeState)),
node: types.maybe(nodeState),

И я начинаю редактировать узел с помощью следующей функции (исходный узел, который я сохранил, чтобы его можно было использовать в функции отмены ()):

startEditing(node) {
    self.nodeOrigin = node;
    self.node = clone(node);
}

И в моем методе рендеринга узел редактирования используется так:

<form className="form">
     <TextField margin='dense' value={getStore().node["name"]} />
</form>

Но когда я изменяю имя и печатаю содержимое как узла, так и исходного узла, они оба меняют имя. NodeOriginal должен содержать оригинальное имя. Что я делаю не так?

1 Ответ

1 голос
/ 14 марта 2019

types.reference привязан к types.identifier.Здесь вы, вероятно, неправильно поняли, что types.reference ссылается на свойство types.identifier данного узла, а не на сам узел.

Когда вы clone, вы не изменяете id оригиналаузел.types.reference разрешается на лету из кэша идентификатора с помощью заданного id, поэтому будет всегда ссылаться на узел с указанным id.

Более того, учитывая, что идентификатор не можетпосле инициализации и что он должен быть уникальным для всего дерева узлов, я бы пришел к выводу, что узлы, имеющие свойство types.identifier, не предназначены для клонирования с помощью утилиты clone.

В качестве альтернативы, вы можете взятьснимок узла, который вы хотите клонировать, вручную обновите свойство types.identifier и создайте из него новый узел.Что-то вроде:

const cloneWithNewId = (node, id) =>
      getType(node).create(Object.assign({}, getSnapshot(node), { id }));
...