D3:链接问题在删除时不会消失

时间:2015-05-13 08:48:28

标签: javascript d3.js

我已将以下内容放在一起 - http://jsfiddle.net/hiwilson1/c48dt2kb/

此处的关键代码:

function generateNodes(p) {

    var node = svg.append("circle")
        .data([p])      
            .call(force.drag)           
            .attr("class", "node")
            .attr("fill", "black")
            .attr("r", 0.1)
            .transition()
            .attr("r", 5)
            .transition().delay(20000)
            .attr("r", 0.1)
            .style("opacity", 0.1)
            .remove()
            .each("end", function() {
                force.links().forEach(function(link, i) {
                    if (link.source == force.nodes()[0] || link.target == force.nodes()[0]) {
                        force.links().splice(i, 1)
                    }
                })
                svg.selectAll("line").data(force.links()).exit().remove()   
                force.nodes().shift()
            })

    force.nodes().push(p)

    generateLinks(p);

    force.start()
}

如果在"十字准线"的半径范围内有任何其他节点,则在鼠标单击时会生成一个节点。它们与最近生成的节点相关联。 20000ms后,节点和链接应该消失。目前对节点工作正常,链接不太好 - 当关联的节点被删除时,它们都不会被删除。 @Lars Kotthoff提到迭代某些东西并从迭代中移除那些东西但是1>这是一个坏主意。我看不到其他方法可以实现我想要的东西2>如果你正在迭代对象肯定会出现任何问题"跳过"你正在迭代的东西被否定了?

1 个答案:

答案 0 :(得分:1)

我已更正您的代码,请参阅http://jsfiddle.net/hxyyhu6b/1/

主要原则:每个链接都获取id,并使用id选择器删除。

现在删除函数迭代器:

            .each("end", function(d) {
                for(var i= 0; i<force.links().length;){
                    var link = force.links()[i]
                    if ((link.source == d) || (link.target == d)) {
                        force.links().splice(i, 1)
                        svg.select("#" + link.id).remove()
                    }
                    else {i++}
                }
                force.nodes().splice(force.nodes().indexOf(d), 1)
            })