В этой статье я расскажу об использовании Message Bus в Backbone.js.

Любой человек, работавший с Backbone, наверняка сталкивался с проблемой, когда то или иное событие нужно передать из одного представления в другое, например, оповестить список заметок об изменении заголовка одной из них.

Многие рекомендуют использовать события jQuery (то есть прикреплять обработчики к тем или иным глобальным объектам страницы), однако это слегка искажает концепцию MVC.

Для преодоления этой проблемы существует механизм, мало освещенный в официальной документации — механизм Message Bus. Этот механизм предоставляет шину сообщений, принимающую различные сообщения. Соответственно, различным сообщениям можно сопоставлять различные обработчики, причем сообщение может быть послано и обработано в разных представлениях или контроллерах (в зависимости от того, где определена шина)

Рассмотрим, как используется шина непосредственно в коде.
Предположим, у нас есть два представления — представление деталей заметки и список заметок. При редактировании деталей список должен быть оповещен об этом для внесения соответственных правок.

Добавление следующего кода в контроллер инициирует появления шины в нужном пространстве имен (в данном случае — App)
App.messageBus = {};
_.extend(App.messageBus, Backbone.Events );


Далее к шине можно обращаться как к App.messageBus

Пусть обновление будет происходить с сообщением «story:update». Присоединим в конструкторе вида списка обработчик к шине для реакции на такое сообщение:

App.messageBus.bind("story:update", this.updateStory);

updateStory: function( model ) {
var view = $(JST[ "stories/list_item" ](model));
view.addClass("selected");

this.storiesContainer.find("#" + model._id).replaceWith(view);
}


Стоит помнить, что для updateStory должен быть вызван _.bindAll

Теперь нам нужно только вызвать нужное сообщение из вида заметки с соответствующей моделью:
App.messageBus.trigger("story:update", model.toJSON());


Сообщение будет передано в другой вид, а обновленная модель — перерисована