如何有无限的勾号?

时间:2015-05-12 14:14:40

标签: javascript d3.js force-layout

我有一个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)属性是真还是假。如果为真则将节点变为黄色。我注意到,一旦图形仍然存在,并且双击它就不会将节点变为黄色,直到再次移动图形为止。

1 个答案:

答案 0 :(得分:0)

tick事件由力布局在其内部状态发生变化时生成,即节点移动时。在某些时候,力模拟将达到一个平衡点,其中影响节点的所有力都是平衡的,你不会看到任何进一步的运动。此时,不会再生成tick个事件。

有很多方法可以延长"达到平衡所需的时间,但除非你打扰节点使力量失衡,否则你无法无限期地延迟这种情况。

这里更好的解决方案(如评论中所指出的)是将用于更新可视化的功能分开,以显示力布局的状态和与节点交互的功能。在您的情况下,您只需运行突出显示单击处理程序中单击的节点的代码。