Комментарии 6
А вы уверены, что вам действительно это нужно?
События реализуют решение в первую очередь для двух задач: всплытие (важно для интерфейсов) и независимость слушателей и эмиттера (важно для автономных блоков).
Половина примеров в тексте — то, что является фактически методом (тот же .trigger('redraw')), вторая может быть реализована в 30 строк кода (если отделять от работы с дом-деревом).
Хотя сам материал глубокий, не спорю, да.
События реализуют решение в первую очередь для двух задач: всплытие (важно для интерфейсов) и независимость слушателей и эмиттера (важно для автономных блоков).
Половина примеров в тексте — то, что является фактически методом (тот же .trigger('redraw')), вторая может быть реализована в 30 строк кода (если отделять от работы с дом-деревом).
Хотя сам материал глубокий, не спорю, да.
Спасибо за Ваш отзыв.
В действительности, толковых примеров использования событийной коммуникации между модулями я и не привел. Если не считать самого последнего кусочка кода. (Первые три секции лишь демонстрировали возможности
Поэтому полностью с Вами согласен, не надо пользоваться событиями, если мы имеем в виду методы. «Источник известен + получатель известен => позови метод.»
Другое дело, когда чего-то из этого становится больше и/или исчезает необходимость жесткого соединения. Это, например, когда источник перестает заботиться о том, сколько получателей примет его сообщение и примет ли вообще. Главное — уведомить. А послушать — это на совести слушащих.
Пример? Я его отложил для второй части, но почему бы и нет. На сайте магазина есть страницы, различающиеся набором и видом виджетов, следящих за изменением корзины. Одни — содержат список товаров, другие — отображают линку с маркером количества товаров в корзине, третьи — предлагают похожие товары на основании уже купленных. Кроме того, добавить товар в корзину пользователь может из различных виджетов (которые могу присутствовать на одних и отсутствовать на других страницах). Но — пользуясь событиями — мы можем сделать так, что успешное добавление товара в корзину (изменение корзины) из любого виджета вызовет событие:
Исключительно методами такое делать можно, разумеется; но событийная система как нельзя лучше отвечает потребностям программиста в данном примере — да и поддерживать легче. (Про поддержку событий я хотел написать отдельно в следующей части.)
Еще раз спасибо!
В действительности, толковых примеров использования событийной коммуникации между модулями я и не привел. Если не считать самого последнего кусочка кода. (Первые три секции лишь демонстрировали возможности
.trigger()
и .on()
по отношению к пользовательским событиям.)Поэтому полностью с Вами согласен, не надо пользоваться событиями, если мы имеем в виду методы. «Источник известен + получатель известен => позови метод.»
Другое дело, когда чего-то из этого становится больше и/или исчезает необходимость жесткого соединения. Это, например, когда источник перестает заботиться о том, сколько получателей примет его сообщение и примет ли вообще. Главное — уведомить. А послушать — это на совести слушащих.
Пример? Я его отложил для второй части, но почему бы и нет. На сайте магазина есть страницы, различающиеся набором и видом виджетов, следящих за изменением корзины. Одни — содержат список товаров, другие — отображают линку с маркером количества товаров в корзине, третьи — предлагают похожие товары на основании уже купленных. Кроме того, добавить товар в корзину пользователь может из различных виджетов (которые могу присутствовать на одних и отсутствовать на других страницах). Но — пользуясь событиями — мы можем сделать так, что успешное добавление товара в корзину (изменение корзины) из любого виджета вызовет событие:
"корзина изменена"
. И может быть — пошлет дополнительные данные. Все виджеты, которые присутствуют в данный момент на странице, заинтересованные в данном событии — предпримут какие-то действия: перерисуются, обратятся за доп. данными и т.п. Так, замигает иконка корзины, пополнится список «Обратите внимание и на эти товары», уйдет пинг на сервер «Подозрительная покупка, сообщите в органы» и т.п.Исключительно методами такое делать можно, разумеется; но событийная система как нельзя лучше отвечает потребностям программиста в данном примере — да и поддерживать легче. (Про поддержку событий я хотел написать отдельно в следующей части.)
Еще раз спасибо!
Для этого все же подходит дата-биндинг, rivets например. В данной ситуации есть модель, отвечающая за хранение данных, и есть автономные вьюхи, отвечающие за представление, и при изначальной загрузке модуля он не должен ждать событий: он должен запросить данные с модели, и если есть — сразу отобразить их.
К концу понял что автор реализовал Pub/Sub =)
(function( $, window, document ) {
var o = $( {} );
$.each({
trigger: 'publish',
on: 'subscribe',
off: 'unsubscribe',
one: 'subscribeOnce'
}, function( key, val ){
$[val] = function() {
o[key].apply( o, arguments );
}
});
})( jQuery, window, document, undefined );
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Пользовательские события в действии