14. С точки зрения кода
Manager — тот же Module.
В нашем случае, часть функций
менеджера выполняется jQuery.
Другая часть выполняется
одним из компонентов.
Manager «размазало» по коду :)
Но дискомофорта из-за этого не испытываем.
Module_2
Component_3
Manager
Event
Component_4
Module_1
Component_1
Component_2
Event-driven. Практика
15. Вызов событий
Генерируем сразу на компоненте.
Избавились от посредников.
Module_2
Component_3
Manager
Event
Component_4
Module_1
Component_1
Component_2
Event-driven. Практика
Шина.
Непосредственно на компоненте.
Специально созданный
объект (proxy).
16. RequestSender = function( elem ){
this.$element = jQuery(elem);
...
}
RequestSender.prototype._getData = function(){
this.$element.trigger('js-waiting-data');
}
Вызов событий
Генерируем сразу на компоненте.
Избавились от посредников.
Module_2
Component_3
Manager
Event
Component_4
Module_1
Component_1
Component_2
Event-driven. Практика
17. Проблема зоны видимости событий
Разные компоненты могут вызывать
один и тот же эвент.
Module_2
Component_3
Manager
Event
Component_4
Module_1
Component_1
Component_2
Event-driven. Практика
События привязаны к компонентам.
Некоторые события существуют
вне компонентов (один элемент —
один эвент — несколько компонентов).
18. RequestSender = function( elem ){
this.$element = jQuery(elem);
}
RequestSender.prototype.complete = function(){
this.$element.trigger('js-form-update');
}
DynamicForm = function( elem ){
this.$element = jQuery(elem);
}
DynamicForm.prototype.update= function(){
this.$element.trigger('js-form-update');
}
Проблема зоны
видимости событий
Разные компоненты могут вызывать
один и тот же эвент.
Module_2
Component_3
Manager
Event
Component_4
Module_1
Component_1
Component_2
Event-driven. Практика
19. Проблема именования событий
Имена событий — параметризуемые.
Module_2
Component_3
Manager
Event
Component_4
Module_1
Component_1
Component_2
Event-driven. Практика
Как быть с дефолтными событиями?
Как быть с событиями конкретных
компонентов?
Что делать с общими событиями?
20. RequestSender = function( elem ){
this.$element = jQuery(elem);
this.requestEvent = this.$element.data('requestEvent');
this.waitingDataEvent = this.$element.data('waitingDataEvent');
this.readyDataEvent = this.$element.data('readyDataEvent');
}
Проблема именования событий
Module_2
Component_3
Manager
Event
Component_4
Module_1
Component_1
Component_2
Event-driven. Практика
Имена события — параметризуемые.
21. Кто вызвал событие
на компоненте?
Источник события — параметр события.
Module_2
Component_3
Manager
Event
Component_4
Module_1
Component_1
Component_2
Event-driven. Практика
Каждому источнику — уникальное
событие.
Передавать источник события.
22. this.$element.trigger(
this.changeEvent,
{'eventSource' : 'filter'}
);
Кто вызвал событие
на компоненте?
Module_2
Component_3
Manager
Event
Component_4
Module_1
Component_1
Component_2
Event-driven. Практика
Источник события — параметр события.
23. Для кого предназначено
событие?
Источник события — параметр события.
Module_2
Component_3
Manager
Event
Component_4
Module_1
Component_1
Component_2
Event-driven. Практика
Получатель — не всегда источник.
Каждому получателю — уникальное
событие.
Передавать получателя.
24. this.$element.trigger(
this.readyEvent,
{'eventTarget' : this.$resultList}
);
Для кого предназначено
событие?
Module_2
Component_3
Manager
Event
Component_4
Module_1
Component_1
Component_2
Event-driven. Практика
Источник события — параметр события.
25. Проблемы внутри компонента
Кто кого: метод вызывает событие
или же событие вызывает метод?
Module_2
Component_3
Manager
Event
Component_4
Module_1
Component_1
Component_2
Event-driven. Практика
Событие предназначено
для связывания компонентов.
Компонент слушает сам себя.
26. Кто кого: метод вызывает событие
или же событие вызывает метод?
Module_2
Component_3
Manager
Event
Component_4
Module_1
Component_1
Component_2
Event-driven. Практика
this._init = function(){
var context = this;
this.$element.on('js-clear', function(){
context.clearFields();
});
}
ИЛИ
this.clearFields = function(){
...
this.$element.trigger('js-clear');
};
Проблемы внутри компонента
27. Кто кого: метод вызывает событие
или же событие вызывает метод?
Module_2
Component_3
Manager
Event
Component_4
Module_1
Component_1
Component_2
Event-driven. Практика
this._init = function(){
var context = this;
this.$element.on('js-do-clear', function(){
context.clearFields();
});
}
this.clearFields = function(){
...
this.$element.trigger('js-complete-clear');
};
Проблемы внутри компонента
28. Event-driven. Итоги
Одинаково работают на любых проектах.—
—
—
—
—
—
Меньше зависимостей, больше гибкости.
Лучшая отказоустойстойчивость.
Сложность восприятия.
Большая вероятность появления «мусора».
Необходимость более тщательного
проектирования приложения.