试图将节点扩展到null父母



我正在使用 cytoscape.js cytoscape.js-expand-collapse 在我的图形结构中创建动态层次结构。我希望能够动态创建一个折叠(合并的)节点,该节点可能会扩展,删除或可能与其他节点重新合并。每当我致电nodes.move({parent:null})时,我都会遇到麻烦。它们从图表中分离出来,我无法将它们重新定为新的parenthnode。如果我在它们上调用restore,我会看到错误说它们已经存在于图中。

mergeunmerge本身在没有现有崩溃节点的简单情况下工作正常。但是,呼叫合并在已经包含一个复合的节点崩溃的事物上会破坏事物。如果没有先前崩溃的合并候选人的孩子,我会得到由此产生的合并节点

更新#1 我已经意识到我的问题是返回错误的移动节点。呼叫。在集合上的move返回一组新节点。因此unmerge应该返回这些。

更新#2 cytoscape-expand-collapse实用程序在父节点塌陷期间进行一些内部图书保存/扩展,通过将节点数据删除在元边缘上的"原始端"数据支柱中。因此,如果我现在通过将节点移入/向父母移动而动态地更改图形,那么这些原始端的指针从同步中却导致无限循环。我正在做一些自己的节点跟踪作为解决方法。

function merge(nodes){
    //if one of the nodes is a compound itself, first uncollapse, then merge
    var collapsed = nodes.filter(function(c){return typeof c.data('collapsedChildren')!=='undefined';});
    if (collapsed.length>0) {
        // for now just assume collapsed is a length of 1
        var unmerged = unmerge(collapsed); //unmerged should be now the former collapsed children
        nodes = nodes.subtract(collapsed).union(unmerged.nodes());
    }
    var parentNode = cy.add({group:'nodes', data: {id: parentID}});
    nodes.move({parent: parentID});
    collapseApi.collapse(parentNode);
    return parentNode;
}
function unmerge(parentNode){
    collapseApi.expand(parentNode);
    var children = parentNode.children();
    var moved = children.move({parent:null});
    //at this point children become "detached" from the graph
    // .removed() returns true, however, calling restore() logs an error and they are still technically in the graph
    parentNode.remove();
    return moved;
}

ele.move()在cytoscape> = 3.4中具有更方便的实现:这些元素是原地修改的,而不是创建替换元素。

使用ele.move()返回集合的旧代码仍将起作用。可以通过完全不需要使用返回的集合来简化新代码。

最新更新