给定以下布局:
... // many nodes ...
正确的更新模式在d3 v4中会如何?我必须在merge(?)中使用什么作为参数,我必须多久调用一次merge(仅在节点上?节点+圆+文本?)
我在小提琴上创建了一个工作示例:https : //jsfiddle.net/cvvfsg97/6/
码:
function update(items) { node = nodeLayer.selectAll(".node") .data(items, function(d) { return d.id; }) node = node.enter() // insert .append("g") .attr("class", "node"); node.append("circle") // insert .attr("r", 2.5) .attr('class', 'circle') .merge(nodeLayer.selectAll('.node > circle')) // is this correct?! // merge .attr('fill', 'red') // just for testing purposes .exit().remove(); // exit node.append("text") // insert .attr("dy", 3) .text(function(d) { return d.name; }) .merge(nodeLayer.selectAll('.node > text')) // is this correct?! // merge .attr('fill', 'green') // just for testing purposes .exit().remove(); node.merge(nodeLayer.selectAll('.node')) // is this correct?! // merge .attr('class', 'anotherClass') .exit().remove(); // does not work // exit }
有人可以就如何在组中使用enter(),merge(),exit()进行一些说明吗?
我可能喜欢在每个阶段的每个元素上进行更改。
更新:我简化了示例,不需要链接或强制布局。我的问题仅是关于更新模式,而不是关于力。更新的jsfiddle没有强制布局。
您正在使模式复杂化。这是正确编写的更新功能:
function update(items) { var node = nodeLayer.selectAll(".node") // bind the data, this is update .data(items, function(d) { return d.id; }); node.exit().remove(); // exit, remove the g nodeEnter = node.enter() // enter, append the g .append("g") .attr("class", "node"); nodeEnter.append("circle") // enter, append the circle on the g .attr("r", 2.5) .attr('class', 'circle') .attr('fill', 'red'); nodeEnter.append("text") // enter, append the text on the g .attr("dy", 3) .text(function(d) { return d.name; }) .attr('fill', 'green'); node = nodeEnter.merge(node); // enter + update on the g node.attr('transform', function(d){ // enter + update, position the g return 'translate(' + d.x + ',' + d.y + ')'; }); node.select("text") // enter + update on subselection .text(function(d) { return d.name; }); }
它在这里运行着多个调用:
function update(items) { var node = nodeLayer.selectAll(".node") // bind the data, this is update .data(items, function(d) { return d.id; }); node.exit().remove(); // exit, remove the g nodeEnter = node.enter() // enter, append the g .append("g") .attr("class", "node"); nodeEnter.append("circle") // enter, append the circle on the g .attr("r", 2.5) .attr('class', 'circle') .attr('fill', 'red'); nodeEnter.append("text") // enter, append the text on the g .attr("dy", 3) .text(function(d) { return d.name; }) .attr('fill', 'green'); node = nodeEnter.merge(node); // enter + update on the g node.attr('transform', function(d){ // enter + update, position the g return 'translate(' + d.x + ',' + d.y + ')'; }); node.select("text") // enter + update on subselection .text(function(d) { return d.name; }); }