Ответ 1
События
Как вы знаете, Backbone.js - это платформа, управляемая событиями. Каждый объект, который он определяет, наследует от объекта Backbone.Events
и может отправлять и получать сообщения о событиях. Это означает, что сам маршрутизатор может прослушивать события.
Использование глобальных сообщений
Начиная с версии 0.9.2, сам глобальный объект Backbone
может использоваться как mediator для глобального обмена сообщениями. Поскольку объект представления в приложении может не знать о маршрутизаторе (особенно это верно при использовании модулей requireJS), можно включить обмен данными между этими объектами с помощью посредника.
Пример маршрутизатора, прослушивающего глобальное событие:
var router = Backbone.Router.extend({
initialize: function() {
this.listenTo( Backbone, 'page-transition', this.animate );
},
animate: function( href, transition, direction ) {
// Do something interesting with this
}
});
Что здесь hapenning?
- Маршрутизатор регистрирует свою собственную функцию
animate
в стекеBackbone.events['page-transition']
при ее создании. - Когда объект
Backbone
запускает событиеpage-transition
, он вызывает функциюrouter.animate
с аргументами, предоставленными триггером события.
Где я могу вызвать событие?
От в любом месте в приложении.
Как мне инициировать событие?
Вот пример, основанный на коде из вашего вопроса:
BaseView = Backbone.View.extend({
events: {
'click a': 'transition'
},
transition: function (e) {
e.preventDefault();
var href = $(e.currentTarget).attr('href'),
transition = $(e.currentTarget).attr('data-transition'),
direction = $(e.currentTarget).attr('data-direction');
Backbone.trigger('page-transition', href, transition, direction );
}
});
Поскольку ваш маршрутизатор уже зарегистрирован в событии page-transition
из объекта Backbone
, он вызовет функцию router.animate
с соответствующими аргументами.
Заключение
Этот шаблон можно использовать везде в вашем приложении Backbone, эти события можно прослушать с помощью любого расширенного объекта Backbone, возможно, это Collection
, Model
, View
, Router
... Вы можете создать специальный медиатор с этим одним слоем:
var mediator = _.extend({}, Backbone.Events);
Этот шаблон очень мощный, поскольку он способствует полной развязке между модулями. Ваши модули не должны знать, кто выполняет функции, они просто должны знать, что это не их ответственность, и предупредить приложение об этом, вызвав событие.