如何拥有无限滴答声?

How to have infinite tick?

我有一个在 tick 上具有功能的 D3 力图。我注意到一旦图形停止,功能将丢失,直到它再次移动。我想知道如何防止这种情况或如何让 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)属性是真还是假。如果为真,则它会将节点变为黄色。我注意到一旦图形静止不动,并且双击,它不会将节点变为黄色,直到您再次移动图形。

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

有一些方法可以 "stretch out" 达到平衡所需的时间,但你不能无限期地延迟它,除非你扰乱节点使力不平衡。

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