D3.js更新留下重复的svg元素

时间:2016-01-13 11:12:23

标签: javascript d3.js

我正在使用D3.js强制布局来创建图形。 要更新节点和边缘,请按照示例代码进行操作 http://bl.ocks.org/mbostock/1095795。 这意味着我有这个代码来初始化布局:

var nodes   = [];
var edges   = [];
var force = d3.layout
                 .force()
                 .nodes(nodes)
                 .links(edges)
                 ... 
var link = svg.selectAll('.link');
var node = svg.selectAll('.node');

我在一个函数中更新数据:

//(nodes and edges array has been updated before)
link = link.data(force.links());
link.enter()
    .append('g')
    .attr('class', 'link');
link.append('line')
    .style('stroke-width', function (d) {
        return d.bond*2 + 'px';
    });
link.exit().remove();

node = node.data(force.nodes());
node.enter()
    .append('g')
    .attr('class', 'node')
    .call(force.drag);

node.append('circle')
    .attr('r', function (d) { return radius(d.size) })
    .style('fill', function (d) { return color(d.type) });
node.exit().remove();

force.start();

我检查了节点和边缘数组的内容以及force.nodes()和force.links(),看起来一切都是正确的, 但图表显示了先前数据的边缘。 所以我也查看了svg,看起来节点和边的组(<g>)包含多个&#39;行&#39;和&#39;圈&#39;元素分别为:

<g class="link">
    <line x1="39.28621930166058" y1="256.22690655336356"
    x2="217.9040028325144" y2="12.304247302113906" 
    style="stroke-width: 2px;"></line>

    <line x1="199.64928632623412" y1="275.35140495955585"
    x2="275.5229250036658" y2="100.33170397523202"
    style="stroke-width: 2px;"></line>
</g> 

这同样适用于节点。

如何在更新时从组中删除以前的元素? 我似乎无法在链接的示例或d3文档中找到答案。

1 个答案:

答案 0 :(得分:1)

link.enter()
    .append('g')
    .attr('class', 'link');
link.append('line')
    .style('stroke-width', function (d) {
        return d.bond*2 + 'px';
    });
link.exit().remove();

link是g.link元素与您的数据的选择/数据连接。

查看上面的内容,您可以通过.enter()为每个新链接添加一个新的g元素,但是您可以在新的和现有的链接中附加一个新的元素元素,因为这样做了那里没有enter()限定符。

尝试

var newLinks = link.enter()
    .append('g')
    .attr('class', 'link');
newLinks.append('line')
    .style('stroke-width', function (d) {
        return d.bond*2 + 'px';
    });

PS。如果这对于线路起作用,则节点的情况相同。