跳至内容

d3-dispatch

分发是一种低级交互机制,允许您注册命名回调,然后使用任意参数调用它们。各种 D3 交互组件,如 d3-drag,使用 dispatch 向监听器发出事件。可以将其视为 EventTarget,只不过每个监听器都有一个明确定义的名称,因此很容易删除或替换它们。

例如,要为 startend 事件创建一个分发器

js
const dispatch = d3.dispatch("start", "end");

然后,您可以使用 dispatch.on 为这些事件注册回调

js
dispatch.on("start", callback1);
dispatch.on("start.foo", callback2);
dispatch.on("end", callback3);

然后,您可以使用 dispatch.calldispatch.apply 调用所有 start 回调

js
dispatch.call("start");

function.call 一样,您也可以指定 this 上下文和任何参数

js
dispatch.call("start", {about: "I am a context object"}, "I am an argument");

dispatch(...types)

源代码 · 为指定的事件 types 创建一个新的分发器。每个 type 都是一个字符串,例如 "start""end"

dispatch.on(typenames, callback)

源代码 · 为指定的 typenames 添加、删除或获取 callback。如果指定了 callback 函数,则将其注册到指定的(完全限定的)typenames。如果之前已为给定的 typenames 注册了回调,则在添加新回调之前会先删除现有回调。

指定的 typenames 是一个字符串,例如 startend.foo。类型后面可以可选地跟一个点 (.) 和一个名称;可选名称允许为同一类型的事件注册多个回调,例如 start.foostart.bar。要指定多个类型名称,请使用空格分隔类型名称,例如 start endstart.foo start.bar

要删除给定名称 foo 的所有回调,请执行 dispatch.on(".foo", null)

如果未指定 callback,则返回指定 typenames 的当前回调(如果有)。如果指定了多个类型名称,则返回第一个匹配的回调。

dispatch.copy()

源代码 · 返回此分发器对象的副本。对此分发器的更改不会影响返回的副本,反之亦然。

dispatch.call(type, that, ...arguments)

源代码 · 与 function.call 一样,调用为指定 type 注册的每个回调,并将指定的 ...argument 传递给回调,并将 that 作为 this 上下文。有关更多信息,请参阅 dispatch.apply

dispatch.apply(type, that, arguments)

源代码 · 与 function.apply 一样,调用为指定 type 注册的每个回调,并将指定的 arguments 传递给回调,并将 that 作为 this 上下文。例如,如果您想在处理本机 click 事件后分发您的 custom 回调,同时保留当前 this 上下文和参数,您可以执行以下操作

js
selection.on("click", function() {
  dispatch.apply("custom", this, arguments);
});

您可以将任何您想要传递给回调的参数传递给回调;最常见的是,您可能会创建一个表示事件的对象,或者传递当前数据 (d) 和索引 (i)。有关更多信息,请参阅 function.callfunction.apply