What is d3-dispatch?
The d3-dispatch module provides a simple mechanism for registering named callbacks and dispatching events to those callbacks. It is part of the D3.js library and is useful for managing events in a modular and decoupled way.
What are d3-dispatch's main functionalities?
Creating a Dispatcher
This feature allows you to create a dispatcher with named events. In this example, a dispatcher is created with two events: 'start' and 'end'.
const d3 = require('d3-dispatch');
const dispatch = d3.dispatch('start', 'end');
Registering Callbacks
This feature allows you to register callbacks for the named events. Here, two callbacks are registered: one for the 'start' event and one for the 'end' event.
dispatch.on('start', () => console.log('Started!'));
dispatch.on('end', () => console.log('Ended!'));
Dispatching Events
This feature allows you to dispatch events, triggering the registered callbacks. In this example, the 'start' and 'end' events are dispatched, causing the respective callbacks to be executed.
dispatch.call('start');
dispatch.call('end');
Passing Arguments to Callbacks
This feature allows you to pass arguments to the callbacks when dispatching events. Here, a message is passed to the 'start' event callback.
dispatch.on('start', (message) => console.log('Started:', message));
dispatch.call('start', null, 'Initialization complete');
Other packages similar to d3-dispatch
eventemitter3
EventEmitter3 is a high performance EventEmitter for Node.js and the browser. It provides a similar event dispatching mechanism but is more general-purpose and not tied to the D3.js ecosystem.
mitt
Mitt is a tiny functional event emitter. It is very lightweight and provides a simple API for event handling, making it a good alternative for small projects or when minimal overhead is desired.
node-event-emitter
Node-Event-Emitter is a simple and lightweight event emitter for Node.js. It offers similar functionality to d3-dispatch but is designed specifically for Node.js environments.
d3-dispatch
Dispatching is a convenient mechanism for separating concerns with loosely-coupled code: register named callbacks and then call them with arbitrary arguments. A variety of D3 components, such as d3-request, use this mechanism to emit events to listeners. Think of this like Node’s EventEmitter, except every listener has a well-defined name so it’s easy to remove or replace them.
For example, if you create a dispatch for "start"
and "end"
callbacks:
var dispatch = d3_dispatch.dispatch("start", "end");
You can then register callbacks for the different types using dispatch.on:
dispatch.on("start", callback1);
dispatch.on("start.foo", callback2);
dispatch.on("end", callback3);
Then, you can invoke the "start"
callbacks using dispatch.type:
dispatch.start("pass arguments to callbacks here");
Want a more involved example? See how to use d3-dispatch for coordinated views.
Installing
If you use NPM, npm install d3-dispatch
. Otherwise, download the latest release. The released bundle supports AMD, CommonJS, and vanilla environments. Create a custom build using Rollup or your preferred bundler. You can also load directly from d3js.org:
<script src="https://d3js.org/d3-dispatch.v0.2.min.js"></script>
In a vanilla environment, a d3_dispatch
global is exported. Try d3-dispatch in your browser.
API Reference
# d3_dispatch.dispatch(types…)
Creates a new dispatch object for the specified types. Each type is a string representing the name of a callback type, such as "zoom"
or "change"
; for each type, a method is exposed on the returned dispatch object for invoking the callbacks of that type.
# dispatch.on(type[, callback])
Adds, removes or gets an callback of the specified type.
The type is a string, such as "start"
or "end"
. To register multiple callbacks for the same type, the type may be followed by an optional namespace, such as "start.foo"
and "start.bar"
. You can remove all registered callbacks for a given namespace by saying dispatch.on(".foo", null)
.
If a callback is specified, it is registered for the specified type. If a callback was already registered for the same type, the existing callback is removed before the new callback is added. If callback is not specified, returns the current callback for the specified type, if any. The specified callback is invoked with the context and arguments specified by the caller; see dispatch.type.
# dispatch.type(arguments…)
The type method (such as dispatch.start
for the "start"
type) invokes each registered callback for the specified type, passing the callback the specified arguments. The this
context will be used as the context of the registered callbacks.
For example, if you wanted to dispatch your "custom"
callbacks after receiving a native "click"
event, while preserving the current this
context and arguments, you could say:
selection.on("click", function() {
dispatch.custom.apply(this, arguments);
});
You can pass whatever arguments you want to callbacks; most commonly, you might create an object that represents an event, or pass the current datum (d) and index (i). See function.call and function.apply for further information.