I'm using one of the force layout examples (http://bl.ocks.org/1153292) to show a network on my web site.
I allow the user to choose which type of links to see at any given time. I notice that when I choose to see link type A, then add link type B and then remove link type A the remain links of type B are presented with A colors.
This is the code that runs to add the links to the svg diagram. I am changing the array this.links
by adding and removing links from it. As you can see I set the class attribute but it is not updating - it remains of type of link 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 + ")"; });
I currently work around this problem by updating the class attribute inside the tick function but this off course cause much un-needed work.
I read that the enter operation return a merged selection of the exist elements and also the new ones so the attr operation should update the exist one and set the new one.
What am I missing?
I've found the answer in this post
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();
The answer is that I need to call attr operator on the result of selectAll.data and not on the result of the append operator.