В этой статье я расскажу об использовании Message Bus в Backbone.js.
Любой человек, работавший с Backbone, наверняка сталкивался с проблемой, когда то или иное событие нужно передать из одного представления в другое, например, оповестить список заметок об изменении заголовка одной из них.
Многие рекомендуют использовать события jQuery (то есть прикреплять обработчики к тем или иным глобальным объектам страницы), однако это слегка искажает концепцию MVC.
Для преодоления этой проблемы существует механизм, мало освещенный в официальной документации — механизм Message Bus. Этот механизм предоставляет шину сообщений, принимающую различные сообщения. Соответственно, различным сообщениям можно сопоставлять различные обработчики, причем сообщение может быть послано и обработано в разных представлениях или контроллерах (в зависимости от того, где определена шина)
Рассмотрим, как используется шина непосредственно в коде.
Предположим, у нас есть два представления — представление деталей заметки и список заметок. При редактировании деталей список должен быть оповещен об этом для внесения соответственных правок.
Добавление следующего кода в контроллер инициирует появления шины в нужном пространстве имен (в данном случае — App)
Далее к шине можно обращаться как к App.messageBus
Пусть обновление будет происходить с сообщением «story:update». Присоединим в конструкторе вида списка обработчик к шине для реакции на такое сообщение:
Стоит помнить, что для updateStory должен быть вызван _.bindAll
Теперь нам нужно только вызвать нужное сообщение из вида заметки с соответствующей моделью:
Сообщение будет передано в другой вид, а обновленная модель — перерисована
Любой человек, работавший с 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());
Сообщение будет передано в другой вид, а обновленная модель — перерисована