RU Внутренние функции - Mingun/d3 GitHub Wiki
Вики ▸ Справка по API ▸ Ядро ▸ Внутренние функции
English | Русский
Различные вспомогательные вещи для реализации переиспользуемых компонентов.
# d3.functor(value)
Если указанное значение value является функцией, возвращает указанное значение. В противном случае возвращает функцию, возвращающую указанное значение. Метод используется внутри D3 как ленивый способ приведения константных значений к функциям, в случае, если свойство может быть указано и как функция, и как константа. Например, многие схемы размещения в D3 позволяют указывать таким образом свойства — это упрощает реализацию, если мы автоматически преобразовываем значения констант в функции.
# d3.rebind(target, source, names…)
Копирует методы с указанными именами names из объекта-источника source в объект-приёмник target и возвращает объект-приёмник. Вызов одного из перечисленных методов на объекте-приёмнике вызовет одноимённый метод на объекте-источнике с передачей ему всех аргументов, переданных методу приёмника и с использованием объекта-источника в качестве контекста this
. Если метод источника возвращает объект-источник, метод приёмника возвратит объект-приёмник (метод-«установщик»); в противном случае метод приёмника вернёт значение метода источника (режим «получателя»). Оператор rebind позволяет наследовать методы (примешивать их) для перепривязки подкласса к другому объекту.
Поведения D3 и более высокоуровневые компоненты, например, кисти, используют d3.dispatch для рассылки пользовательских событий.
Для визуализаций с скоординированными областями просмотра, d3.dispatch предоставляет удобный и легкий механизм для слабой связи компонентов. Организация кода с d3.dispatch может помочь с разделением обязанностей и сделать код более простым в поддержке.
# d3.dispatch(types…)
Создаёт новый объект диспетчера для указанных типов types. Каждый аргумент является строкой, представляющей имя типа события, например «zoom» или «change». Возвращаемый объект является ассоциативным массивом; каждое имя типа ассоциируется с объектом-диспетчером. Например, если вы хотите создать диспетчера для событий «start» и «end», вы можете написать:
var dispatch = d3.dispatch("start", "end");
Затем вы сможете получать доступ к диспетчерам для разных типов событий через атрибуты dispatch.start
и dispatch.end
. Например, вы можете добавить слушатель событий:
dispatch.on("start", listener);
А потом передать событие всем зарегистрированным слушателям:
dispatch.start();
За деталями о том, как передавать аргументы в слушатели событий, смотрите документацию по методу dispatch.
# dispatch.on(type[, listener])
Добавляет или удаляет слушатель событий listener для указанного типа type. Тип type должен быть строкой имени типа события, например «start» или «end». Указанный слушаетль listener вызывается с контестом и аргументами, определяемыми вызывающей стороной; смотрите dispatch. Кроме того, вы можете удалить всех зарегистрированных слушателей для данного пространства имён, написав dispatch.on(".foo", null)
.
Если слушатель событий уже зарегистрирован для указанного типа, существующий слушатель будет удалён перед тем как новый слушатель будет добавлен. Для регистрирования нескольких слушателей с одинаковым типом события, за типом может следовать необязательное пространство имён, например «click.foo» или «click.bar».
Если параметр listener не указан, возвращает текущий слушатель, ассоциированный с указаным типом type, если таковой имеется.
# dispatch.type(arguments…)
Метод type (как dispatch.start
в примере выше) уведомляет все зарегистрированные слушатели, передавая слушателю указанные аргументы arguments. Контекст this
будет использоваться в качестве контекста зарегистрированного слушателя. Например, для вызова всех зарегистрированных слушателей с контекстом foo и агрументом bar, напришите dispatch.call(*foo*, *bar*)
. Таким образом, вы можете передавать любые аргументы в ваши слушатели; в большинстве случаев вы можете создать объект, представляющий событие или использовать текущую привязку к данным (d) и индекс (i). Так же вы можете контролировать контекст this
внутри слушателя, использую методы call или apply.
Например, если вы хотите пробросить родное событие «click» в своё собственное событие «custom», сохранив при этом контекст и аргументы, можно написать так:
selection.on("click", function(d, i) {
dispatch.custom.apply(this, arguments);
});