如何在不使用cytoscape.js重绘图形的情况下删除特定边缘?

时间:2019-06-22 13:16:49

标签: cytoscape.js

给定cytoscape.js中的一个节点,我试图删除该节点以及该节点的所有定向(输入和输出)边缘。我已经编写了一些快速且肮脏的过滤器来执行此操作,但是调用cy.remove(edges);会在控制台上显示“不存在这种方法”错误消息。通过相同的方法删除节点效果很好,但是删除所有连接到已删除节点的节点,在我的情况下,这是整个图(大多数情况下)。因此,我尝试从数据源中删除边缘和节点,然后重新绘制图形,但这不是正确的方法,因为它会重新绘制图形并更改布局(即刷新画布)。 / p>

我该如何解决?

                //data is the id of the node I want to remove
                var filteredEdges = this.elements.edges.filter((x, idx, arr) => 
                {
                    return x.source != data && x.target != data ;
                });

                var removedEdges = this.elements.edges.filter((x, idx, arr) => 
                {
                    return x.source == data || x.target == data ;
                });
                //this.cy.remove(removedEdges); this fails

                this.elements.edges = filteredEdges;

                var filteredNodes = this.elements.nodes.filter((x, idx, arr) =>
                {
                    return x.id != data;
                });
                this.cy.remove(data);
                this.elements.nodes = filteredNodes;
                this.render(); // this re-draws the whole graph, not a useable approach

1 个答案:

答案 0 :(得分:0)

使用选择器解决它。 cytoscape.js的文档非常缺乏。对于将来某个时候遇到此问题的任何人,这是我的做法:

this.cy.remove('edge[source=\'' + nodeId + '\']');
this.cy.remove('edge[target=\'' + nodeId + '\']');
this.cy.remove('#' + nodeId);