Как эффективно обновить модель графа после определенной операции в mxgraph?

После последовательного перетаскивания в mxgraph родительская информация для ячейки теряется.

Дети и родители для ячейки не обновляются после последовательного перетаскивания.

Перетаскивание обрабатывается с помощью подключения, логика проста. Удаление существующего родительского соединения и установка нового граничного соединения с целевым узлом.

mxConnectionHandler.prototype.connect = function(
      source,
      target,
      evt,
      dropTarget
    ) {
      var sourceParentCell = getParentCell(source);
      if (sourceParentCell !== target) {
        graph.getModel().beginUpdate();
        try {
          var edges = graph.getEdgesBetween(sourceParentCell, source);
          _.each(edges, edge => {
            graph.getModel().remove(edge);
          });
          graph.insertEdge(parent, null, '', target, source);
        } finally {
          graph.getModel().endUpdate();
        }
      }
    };
  }

Здесь находится обработчик события щелчка для ячейки, который предоставляет информацию о ячейке при нажатии вместе с ее непосредственной информацией о родительской ячейке.

graph.addListener(mxEvent.CLICK, function(sender, evt) {
      var cell = evt.getProperty('cell');
      if (cell && cell.id) {
        const nodeData = hierarchialData(graph, cell);
        console.log('cellInfo => ', JSON.stringify(nodeData));
        console.log(
          'parentInfo => ',
          JSON.stringify(getParentCell(cell).value)
        );
      }
    });

Приведенный выше код отлично работает для двух перетаскиваний, позже parentInfo теряется и показывает саму ячейку как ее родителя.

Развернуто в Heroku здесь: https://express-mxgraph.herokuapp.com/

Демонстрация:

введите здесь описание изображения

Когда он достигает узла: 20-Double click to set name, вы заметите, что его parentInfo такой же: 20-Double click to set name, а не 22-Double click to set name, и, следовательно, построение края с треском проваливается.

Что здесь происходит, правильно ли я обновляю вершину и ребро или нет?

Также при загрузке URL-адреса вы можете заметить, что весь график перетаскивается в направлении движения мыши. Этого также следует избегать.

Действия по воспроизведению:

  • Переместить 14-Double click to set name под 20-Double click to set name

    Нажмите на 14-Double click to set name, вы увидите cellInfo как 14-Double click to set name и parentInfo как 20-Double click to set name, что правильно.

  • Теперь перетащите 20-Double click to set name под 22-Double click to set name.

    Нажмите на 20-Double click to set name, CellInfo и ParentInfo содержат 20-Double click to set name. ParentInfo на самом деле должен содержать 22-Double click to set name.

  • Итак, ячейка 20-Double click to set name уже в плохом состоянии, и теперь, когда вы пытаетесь соединиться с 18-Double click to set name. График ломается


person Mithun Shreevatsa    schedule 04.09.2019    source источник
comment
Не могли бы вы написать несколько шагов, чтобы воспроизвести вашу проблему, пожалуйста?   -  person NickAth    schedule 05.09.2019
comment
@NickAth - я продемонстрировал через gif выше. Вы хотите, чтобы я написал эти шаги?   -  person Mithun Shreevatsa    schedule 05.09.2019
comment
На гифке я вижу прямо ошибку (cellInfo равно «12», а должно быть «14», я прав?) Но я не вижу шагов, предпринятых до этого, которые привели к этому результату.   -  person NickAth    schedule 05.09.2019
comment
Это правильно, cellInfo - это конкретная информация о ячейке, при нажатии на 14-Double click to set name, cellInfo будет 14, т.е. информация об идентификаторе ее собственной ячейки, и есть parentInfo, который дает значение своей ячейки, т.е. 12-Double click to set name   -  person Mithun Shreevatsa    schedule 05.09.2019
comment
@NickAth - также обновил вопрос с шагами для воспроизведения   -  person Mithun Shreevatsa    schedule 05.09.2019
comment
Не могли бы вы предоставить функцию getParent?   -  person NickAth    schedule 05.09.2019
comment
Конечно, я повторно развернулся на героку с кодом без ошибок, вызванным getParent fn, и код: function getParentCell(cell) { if (cell.vertex) { return cell.edges[0].source; } return ''; }   -  person Mithun Shreevatsa    schedule 05.09.2019
comment
Еще одна важная вещь, которую я заметил здесь, заключается в том, что вы просто перетаскиваете ячейку, где оба подключены к одному и тому же родителю, это выдает ошибку. 20 -> 22 выдает мне ошибку, так как им меньше 16.   -  person Mithun Shreevatsa    schedule 05.09.2019
comment
ошибка все еще воспроизводится в приложении heroku   -  person NickAth    schedule 05.09.2019
comment
Действительно, пожалуйста, очистите кеш и дайте мне знать, как я могу воспроизвести. Кроме того, это не блокировщик, блокировщик - это разрыв отношений между родителями и детьми. Вы случайно не подозреваете, что виноват getParentCell?   -  person Mithun Shreevatsa    schedule 05.09.2019
comment
Да, у меня кеш почищен. Что я делаю: 1) Добавляю 14 до 20 2) Добавляю 20 до 22 Теперь родительская информация «20» равна «20», а должна быть «22». Я подозреваю, что проблема действительно связана с getParentCell (cell) , возможно, это связано с неправильной ссылкой, не могли бы вы попробовать вместо graph.insertEdge(parent, null, '', target, source); сделать следующее? let sourceCopy = source.clone(); graph.removeCells([source]); graph.insertEdge(parent, null, '', target, sourceCopy ); ?   -  person NickAth    schedule 05.09.2019
comment
Бум. Это не работает. Загружено на github.com/hansiemithun/node-mxgraph. Пожалуйста, проверьте   -  person Mithun Shreevatsa    schedule 05.09.2019
comment
@NickAth - повезло?   -  person Mithun Shreevatsa    schedule 05.09.2019
comment
Какая это версия mxgraph?   -  person Safal Pillai    schedule 11.06.2020


Ответы (1)


Поскольку я не смог найти никаких ссылок для клонирования, а глубокое клонирование имеет ошибку в самом jGraph, а также в его открытой проблеме, мне удалось решить эту проблему, имея эталонную копию ячейки и реконструируя ячейки под целью.

mxConnectionHandler.prototype.connect = function(source, target) {
  const nodeData = [{"id":"12","value":"12-Double click to set name","children":[{"id":"14","value":"14-Double click to set name"}]}]
  drawNodes(graph, nodeData, target, source); // recursively
};
person Mithun Shreevatsa    schedule 06.09.2019