d3-dispatch
分发是一种低级交互机制,允许您注册命名回调,然后使用任意参数调用它们。各种 D3 交互组件,如 d3-drag,使用 dispatch 向监听器发出事件。可以将其视为 EventTarget,只不过每个监听器都有一个明确定义的名称,因此很容易删除或替换它们。
例如,要为 start 和 end 事件创建一个分发器
const dispatch = d3.dispatch("start", "end");
然后,您可以使用 dispatch.on 为这些事件注册回调
dispatch.on("start", callback1);
dispatch.on("start.foo", callback2);
dispatch.on("end", callback3);
然后,您可以使用 dispatch.call 或 dispatch.apply 调用所有 start 回调
dispatch.call("start");
与 function.call 一样,您也可以指定 this
上下文和任何参数
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 是一个字符串,例如 start
或 end.foo
。类型后面可以可选地跟一个点 (.
) 和一个名称;可选名称允许为同一类型的事件注册多个回调,例如 start.foo
和 start.bar
。要指定多个类型名称,请使用空格分隔类型名称,例如 start end
或 start.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
上下文和参数,您可以执行以下操作
selection.on("click", function() {
dispatch.apply("custom", this, arguments);
});
您可以将任何您想要传递给回调的参数传递给回调;最常见的是,您可能会创建一个表示事件的对象,或者传递当前数据 (d) 和索引 (i)。有关更多信息,请参阅 function.call 和 function.apply。