如何防止调用后触发 d3 刷事件 brush.move

How to prevent d3 brush events from firing after calling brush.move

我并排显示几个相同的图表(显示不同的数据集)。在一张图表上刷完后,刷子应该复制到所有其他图表上。

目前,我通过在不包括当前刷过的图表的所有图表的 selection 上调用 brush.move 来做到这一点,一旦有人刷过图表。这发生在 brush 类型的 eventListener 中。

但是,此 brush.move 会触发附加到画笔的 brush 类型的事件,从而导致错误(或者,更一般地,无限循环)。

我怎样才能避免这种情况?

您可以使用d3.event对象来查看是什么导致了刷机的更新。来自 brush events 上的 API 文档:

Brush Events

When a brush event listener is invoked, d3.event is set to the current brush event. The event object exposes several fields:

  • sourceEvent - the underlying input event, such as mousemove or touchmove.

如果您的画笔以编程方式修改,即通过调用 brush.move()d3.event.sourceEvent 属性 将为空,因为没有输入事件导致此更新。在您的事件处理程序中,您可以检查此 属性 以跳过程序更改的执行:

if (!d3.event.sourceEvent) return;

Mike Bostock 在他的 Brush Snapping Block 中采用了相同的技术。在处理实际输入事件时,再次修改画笔以捕捉到最近的值,显然,这不应触发事件处理程序的另一个 运行。