我正在使用其中一个强制布局示例(http://bl.ocks.org/1153292)在我的网站上显示网络。
我允许用户在任何给定时间选择要查看的链接类型。我注意到,当我选择查看链接类型A,然后添加链接类型B,然后删除链接类型A时,类型B的剩余链接将显示为A颜色。
这是用于添加指向svg图表的链接的代码。我正在通过添加和删除链接来更改数组this.links
。正如您所看到的,我设置了class属性但它没有更新 - 它仍然是链接A的类型。
var path = svg.append("svg:g")
.selectAll("path")
.data(this.links)
.enter()
.append("svg:path")
.attr("class", function(d) { return "link " + d.type; })
.attr("marker-end", function(d) { return "url(#" + d.type + ")"; });
我目前通过更新tick函数中的class属性来解决这个问题,但这会导致很多不需要的工作。
我读到输入操作返回已存在元素和新元素的合并选择,因此attr操作应该更新存在元素并设置新元素。
我错过了什么?
答案 0 :(得分:19)
var circle = svg.selectAll("circle")
.data(data);
circle.enter().append("circle")
.attr("r", 2.5);
circle
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
circle.exit().remove();
答案是我需要在selectAll.data的结果上调用attr运算符而不是在append运算符的结果上调用。
答案 1 :(得分:4)
http://bl.ocks.org/1095795处有一个示例,显示了从强制定向布局添加和删除节点。必须单独处理链接和节点,然后必须重新启动强制布局。
function restart() {
var link = vis.selectAll("line.link")
.data(links, function(d) { return d.source.id + "-" + d.target.id; });
link.enter().insert("svg:line", "g.node")
.attr("class", "link");
link.exit().remove();
var node = vis.selectAll("g.node")
.data(nodes, function(d) { return d.id;});
var nodeEnter = node.enter().append("svg:g")
.attr("class", "node")
.call(force.drag);
nodeEnter.append("svg:image")
.attr("class", "circle")
.attr("xlink:href", "https://d3nwyuy0nl342s.cloudfront.net/images/icons/public.png")
.attr("x", "-8px")
.attr("y", "-8px")
.attr("width", "16px")
.attr("height", "16px");
nodeEnter.append("svg:text")
.attr("class", "nodetext")
.attr("dx", 12)
.attr("dy", ".35em")
.text(function(d) { return d.id });
node.exit().remove();
force.start();
}