d3-dispatch
dispatch是一个用于分离loosely-coupled(低耦合)代码之间关系的方便机制;注册具名回调函数,然后用任意参数调用它们。D3的各种组件,如d3-fetch,都使用这种机制向监听器派发事件。把这个想象成Node的EventEmitter,除了每个事件监听器都有一个明确的名称,所以移除或替换它们很容易。
例如,为start和end事件创建一个dispatch:
var 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");
想了解一个更复杂的例子吗?另请参阅d3-dispatch for coordinated views。
Installing
如果你使用npm,请键入npm install d3-dispatch
。否则,请下载最新版本。你也可以直接从d3js.org加载,作为standalone library(独立库)或D3 4.0的一部分来使用。支持AMD,CommonJS和vanilla环境。在vanilla环境下,会输出一个全局的d3
:
<script src="https://d3js.org/d3-dispatch.v1.min.js"></script>
<script>
var dispatch = d3.dispatch("start", "end");
</script>
API Reference
d3.dispatch(types…)
为给定的事件types创建一个新的dispatch。每个type都是一个字符串,如“start”
或“end”
。
dispatch.on(typenames[, callback])
添加、移除或获取给定typenames的callback。如果指定了一个callback函数,则将为给定的(完全合格)typenames注册该函数。如果给定typenames上已经注册了一个回调函数,则在添加新的回调函数前会先移除已有的回调函数。
给定的typenames为一个字符串,如start
或end.foo
。类型后面可以选择跟上一个句点(.)和名称;可选的名称允许注册多个回调函数来接收同一类型的事件,如start.foo
和start.bar
。想要指定多个typenames,可以使用空格进行分隔,如start end
或start.foo start.bar
。
想要移除给定名称foo
的所有回调函数,可以这样写dispatch.on(".foo", null)
。
如果不指定callback,则返回给定typenames当前的回调函数(如果有的话)。如果指定了多个typenames,则返回第一个匹配的回调函数。
dispatch.copy()
返回此dispatch对象的一个副本。此dispatch的改变不会影响返回的副本,反之亦然。
dispatch.call(type[, that[, arguments…]])
就像function.call,为给定type调用每个已注册的回调函数,传入给定的arguments,并将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了解更多。