Backbone.js предоставляет лёгкий, но мощный механизм организации взаимодействия между компонентами через архитектуру Pub/Sub (Publisher/Subscriber). Эта модель позволяет отделить источники событий от их обработчиков, что существенно упрощает масштабирование и поддержку приложений.
Backbone реализует Pub/Sub через объект Backbone.Events, который может быть примешан к любому объекту. Это позволяет любому объекту становиться издателем событий.
Подключение событийного механизма к объекту:
var dispatcher = {};
_.extend(dispatcher, Backbone.Events);
Теперь объект dispatcher может генерировать
события и подписываться на них.
Подписка на событие:
dispatcher.on('custom:event', function(message) {
console.log('Получено сообщение:', message);
});
Генерация события:
dispatcher.trigger('custom:event', 'Hello, Backbone!');
В консоли будет выведено:
Получено сообщение: Hello, Backbone!
Удаление подписки:
dispatcher.off('custom:event');
Использование on, off, trigger
обеспечивает полный контроль над событиями, позволяя создавать гибкие
взаимодействия между компонентами.
Модели в Backbone.js часто выступают издателями, а представления — подписчиками:
var Task = Backbone.Model.extend({});
var task = new Task();
var TaskView = Backbone.View.extend({
initialize: function() {
this.listenTo(this.model, 'change', this.render);
},
render: function() {
console.log('Модель обновлена:', this.model.toJSON());
}
});
var taskView = new TaskView({ model: task });
task.set({ title: 'Учить Backbone.js', done: false });
listenTo связывает представление с моделью,
автоматически обрабатывая события.set) автоматически вызывается
метод render, обеспечивая реактивность интерфейса.Использование listenTo предпочтительно перед
on, так как автоматически снимает подписку при удалении
представления, предотвращая утечки памяти.
Для крупного приложения часто создаётся центральный объект-событийная шина, который связывает разрозненные компоненты без прямых зависимостей:
var EventBus = _.extend({}, Backbone.Events);
var ViewA = Backbone.View.extend({
events: {
'click button': 'notify'
},
notify: function() {
EventBus.trigger('viewA:clicked', { time: Date.now() });
}
});
var ViewB = Backbone.View.extend({
initialize: function() {
this.listenTo(EventBus, 'viewA:clicked', this.react);
},
react: function(data) {
console.log('ViewB реагирует на событие ViewA', data);
}
});
EventBus выступает центральным узлом для передачи
событий между ViewA и ViewB.Backbone.Events позволяет:
dispatcher.on('start stop reset', function() { console.log('Событие произошло'); });
dispatcher.on('custom:event', callback, contextObject);
once:dispatcher.once('init', function() { console.log('Инициализация выполнена'); });
Такой подход особенно полезен для одноразовых инициализаций или стартовых настроек.
listenTo внутри View
вместо on, чтобы управлять временем жизни подписок.model:change, view:render, чтобы
облегчить поддержку.Архитектура Pub/Sub в Backbone.js позволяет создавать гибкие, масштабируемые и легко тестируемые приложения, где компоненты остаются слабо связанными, а взаимодействие между ними полностью контролируемо через события.