Backbone.js реализует паттерн Observer через систему событий, предоставляя гибкий механизм для организации взаимодействия между объектами. Этот подход позволяет объектам уведомлять друг друга об изменениях без прямой зависимости, что повышает модульность и поддерживаемость кода.
Каждый объект в Backbone, который наследует
Backbone.Events, может:
on.off.trigger.Пример базового использования:
var obj = {};
_.extend(obj, Backbone.Events);
obj.on('change', function() {
console.log('Событие change вызвано');
});
obj.trigger('change');
В этом примере объект obj становится наблюдаемым. Вызов
trigger инициирует уведомление всех подписанных
обработчиков.
В Backbone.js модель (Backbone.Model)
автоматически наследует события. Это позволяет отслеживать изменения
атрибутов модели и реагировать на них.
Слежение за изменениями атрибутов:
var Task = Backbone.Model.extend({});
var task = new Task({ title: 'Учить Backbone.js', done: false });
task.on('change:title', function(model, value) {
console.log('Заголовок изменён на', value);
});
task.set('title', 'Изучать Backbone.js глубже');
Здесь событие change:title уведомляет о конкретном
изменении атрибута, а change — о любом изменении
модели.
Ключевые моменты:
change срабатывает после всех изменений модели.change:attribute позволяет отслеживать отдельный
атрибут.Коллекции (Backbone.Collection) предоставляют удобный
способ группировки моделей и также используют событийную систему.
Пример:
var TaskList = Backbone.Collection.extend({
model: Task
});
var tasks = new TaskList();
tasks.on('add', function(model) {
console.log('Модель добавлена:', model.get('title'));
});
tasks.add(new Task({ title: 'Написать статью' }));
Основные события коллекции:
add — при добавлении модели.remove — при удалении модели.reset — при полной замене содержимого коллекции.update — при любом изменении коллекции (добавление,
удаление, сортировка).События коллекции помогают поддерживать синхронизацию между моделями и представлениями, минимизируя прямые вызовы методов.
Представления (Backbone.View) используются для
управления отображением данных и реагирования на пользовательские
действия. Они могут слушать события как моделей, так и коллекций.
Пример привязки событий:
var TaskView = Backbone.View.extend({
initialize: function() {
this.listenTo(this.model, 'change', this.render);
},
render: function() {
console.log('Обновление представления:', this.model.get('title'));
}
});
var taskView = new TaskView({ model: task });
task.set('title', 'Пример использования Backbone.js');
Особенности использования listenTo:
on.Backbone.Events позволяет создавать собственные события для нестандартных сценариев.
var notifier = {};
_.extend(notifier, Backbone.Events);
notifier.on('notify', function(message) {
console.log('Уведомление:', message);
});
notifier.trigger('notify', 'Новая задача создана');
Такой подход универсален и может применяться для коммуникации между модулями приложения.
Событийная система Backbone облегчает построение архитектуры с чётким разделением обязанностей:
Пример комплексного взаимодействия:
var TaskAppView = Backbone.View.extend({
initialize: function() {
this.listenTo(this.collection, 'add', this.addTask);
},
addTask: function(task) {
var view = new TaskView({ model: task });
view.render();
}
});
var appView = new TaskAppView({ collection: tasks });
tasks.add(new Task({ title: 'Изучить Observer pattern' }));
В этом примере добавление новой модели автоматически инициирует создание и рендер представления, демонстрируя полностью событийно-ориентированный подход.
listenTo вместо прямого on
для автоматического снятия слушателей.Эффективное применение Observer Pattern через события в Backbone.js позволяет строить масштабируемые, модульные и легко тестируемые приложения, где объекты взаимодействуют без жёсткой зависимости друг от друга.