d3-dispatch
Диспетчеризация — удобный механизм для разделения задач с слабосвязанным кодом: регистрация именованных обратных вызовов и их вызов с произвольными аргументами. Различные компоненты D3, такие как d3-request, используют этот механизм для отправки событий слушателям. Подумайте об этом как о EventEmitter Node.js, за исключением того, что каждый слушатель имеет чётко определённое имя, что облегчает их удаление или замену.
Например, для создания диспетчера для событий start и end:
var dispatch = d3.dispatch("start", "end"); Затем вы можете зарегистрировать обратные вызовы для этих событий, используя dispatch.on:
dispatch.on("start", callback1);
dispatch.on("start.foo", callback2);
dispatch.on("end", callback3); Затем вы можете вызвать все обратные вызовы start, используя dispatch.call или dispatch.apply:
dispatch.call("start"); Как и function.call, вы также можете указать this контекст и любые аргументы:
dispatch.call("start", {about: "I am a context object"}, "I am an argument"); Хотите более подробный пример? Посмотрите, как использовать d3-dispatch для координированных представлений.
Установка
Если вы используете NPM, npm install d3-dispatch. В противном случае, загрузите последнюю версию. Вы также можете загрузить напрямую с d3js.org, как автономную библиотеку или как часть 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> Попробуйте d3-dispatch в своём браузере.
Справочник по API
d3.dispatch(types…) Исходный код
Создаёт новый диспетчер для указанных типов событий types. Каждый type — это строка, например "start" или "end".
dispatch.on(typenames[, callback]) Исходный код
Добавляет, удаляет или получает обратный вызов callback для указанных typenames. Если функция 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, передавая обратным вызовам указанные arguments с that в качестве this контекста. Для получения дополнительной информации см. dispatch.apply.
dispatch.apply(type[, that[, arguments]]) Исходный код
Аналогично function.apply, вызывает каждый зарегистрированный обратный вызов для указанного type, передавая обратным вызовам указанные arguments с that в качестве this контекста. Например, если вам нужно отправить свои custom обратные вызовы после обработки события click, сохраняя текущий this контекст и аргументы, вы можете написать так:
selection.on("click", function() {
dispatch.apply("custom", this, arguments);
}); Вы можете передавать любые аргументы обратным вызовам; чаще всего вы создаёте объект, представляющий событие, или передаёте текущий элемент данных (d) и индекс (i). Для получения дополнительной информации см. function.call и function.apply.
© 2010–2018 Michael Bostock
Licensed under the BSD License.
https://github.com/d3/d3-dispatch