Как стать автором
Обновить

Комментарии 6

А вы уверены, что вам действительно это нужно?
События реализуют решение в первую очередь для двух задач: всплытие (важно для интерфейсов) и независимость слушателей и эмиттера (важно для автономных блоков).

Половина примеров в тексте — то, что является фактически методом (тот же .trigger('redraw')), вторая может быть реализована в 30 строк кода (если отделять от работы с дом-деревом).

Хотя сам материал глубокий, не спорю, да.
Извините, ошибся кнопкой. Ответил отдельным комментарием.
Спасибо за Ваш отзыв.

В действительности, толковых примеров использования событийной коммуникации между модулями я и не привел. Если не считать самого последнего кусочка кода. (Первые три секции лишь демонстрировали возможности .trigger() и .on() по отношению к пользовательским событиям.)

Поэтому полностью с Вами согласен, не надо пользоваться событиями, если мы имеем в виду методы. «Источник известен + получатель известен => позови метод.»
Другое дело, когда чего-то из этого становится больше и/или исчезает необходимость жесткого соединения. Это, например, когда источник перестает заботиться о том, сколько получателей примет его сообщение и примет ли вообще. Главное — уведомить. А послушать — это на совести слушащих.

Пример? Я его отложил для второй части, но почему бы и нет. На сайте магазина есть страницы, различающиеся набором и видом виджетов, следящих за изменением корзины. Одни — содержат список товаров, другие — отображают линку с маркером количества товаров в корзине, третьи — предлагают похожие товары на основании уже купленных. Кроме того, добавить товар в корзину пользователь может из различных виджетов (которые могу присутствовать на одних и отсутствовать на других страницах). Но — пользуясь событиями — мы можем сделать так, что успешное добавление товара в корзину (изменение корзины) из любого виджета вызовет событие: "корзина изменена". И может быть — пошлет дополнительные данные. Все виджеты, которые присутствуют в данный момент на странице, заинтересованные в данном событии — предпримут какие-то действия: перерисуются, обратятся за доп. данными и т.п. Так, замигает иконка корзины, пополнится список «Обратите внимание и на эти товары», уйдет пинг на сервер «Подозрительная покупка, сообщите в органы» и т.п.

Исключительно методами такое делать можно, разумеется; но событийная система как нельзя лучше отвечает потребностям программиста в данном примере — да и поддерживать легче. (Про поддержку событий я хотел написать отдельно в следующей части.)

Еще раз спасибо!
Для этого все же подходит дата-биндинг, rivets например. В данной ситуации есть модель, отвечающая за хранение данных, и есть автономные вьюхи, отвечающие за представление, и при изначальной загрузке модуля он не должен ждать событий: он должен запросить данные с модели, и если есть — сразу отобразить их.
Неплохой способ быстро реализовать Pub/Sub шаблон, но идея далеко не нова
К концу понял что автор реализовал 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 );
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории