После последовательного перетаскивания в 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
. График ломается
14-Double click to set name
, cellInfo будет 14, т.е. информация об идентификаторе ее собственной ячейки, и есть parentInfo, который дает значение своей ячейки, т.е.12-Double click to set name
- person Mithun Shreevatsa   schedule 05.09.2019function getParentCell(cell) { if (cell.vertex) { return cell.edges[0].source; } return ''; }
- person Mithun Shreevatsa   schedule 05.09.2019graph.insertEdge(parent, null, '', target, source);
сделать следующее?let sourceCopy = source.clone(); graph.removeCells([source]); graph.insertEdge(parent, null, '', target, sourceCopy );
? - person NickAth   schedule 05.09.2019