我有一个D3强制图,其中包含tick
的功能。我注意到,一旦图形停顿,功能将丢失,直到它再次移动。我想知道如何防止这种情况或如何始终使用tick
?
一个例子是我有以下代码
force.on("tick", function() {
link.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
node.style("fill", function(d) { if (d.selected===true) {return "yellow"} else return d.data['color'] }).select("circle").style("stroke", "black");
});
// highlight node on dblclick
function highlight(d) {
if (d.selected == false) {
d.selected = true;
}
else {
d.selected = false;
}
}
不断检查节点的数据selected
(来自JSON)属性是真还是假。如果为真则将节点变为黄色。我注意到,一旦图形仍然存在,并且双击它就不会将节点变为黄色,直到再次移动图形为止。
答案 0 :(得分:0)
tick
事件由力布局在其内部状态发生变化时生成,即节点移动时。在某些时候,力模拟将达到一个平衡点,其中影响节点的所有力都是平衡的,你不会看到任何进一步的运动。此时,不会再生成tick
个事件。
有很多方法可以延长"达到平衡所需的时间,但除非你打扰节点使力量失衡,否则你无法无限期地延迟这种情况。
这里更好的解决方案(如评论中所指出的)是将用于更新可视化的功能分开,以显示力布局的状态和与节点交互的功能。在您的情况下,您只需运行突出显示单击处理程序中单击的节点的代码。