Backbone.js предоставляет мощный механизм событий, который лежит в
основе взаимодействия компонентов и поддержания реактивного поведения
приложений. Любой объект, расширяющий Backbone.Events,
может подписываться на события, генерировать
их и снимать подписку. Это обеспечивает гибкую
связь между моделями, коллекциями и представлениями без жесткой
зависимости между ними.
Простейший синтаксис использования событий выглядит так:
var obj = {};
_.extend(obj, Backbone.Events);
obj.on('change', function() {
console.log('Событие change произошло');
});
obj.trigger('change');
on(event, callback, context) — привязывает обработчик к
событию.off(event, callback, context) — снимает
обработчик.trigger(event, ...) — вызывает событие с передачей
дополнительных аргументов.once(event, callback, context) — привязывает
одноразовый обработчик.Модели Backbone используют события для уведомления об изменениях состояния:
var Task = Backbone.Model.extend({
defaults: {
title: '',
completed: false
}
});
var task = new Task();
task.on('change:completed', function(model, completed) {
console.log('Статус задачи изменен на', completed);
});
task.set('completed', true);
change:attribute позволяет реагировать на
изменения конкретного свойства модели.change срабатывает при изменении любого
атрибута.Коллекции используют события для управления наборами моделей:
var Tasks = Backbone.Collection.extend({ model: Task });
var tasks = new Tasks();
tasks.on('add', function(model) {
console.log('Добавлена новая задача:', model.get('title'));
});
tasks.add({ title: 'Изучить Backbone.js' });
Ключевые события коллекций:
add — добавление модели.remove — удаление модели.reset — сброс всей коллекции.sort — сортировка коллекции.При разработке сложных приложений часто возникает необходимость отслеживать порядок срабатывания событий и проверять, какие обработчики вызваны. Для этого Backbone предоставляет методы, которые могут использоваться совместно с утилитами отладки:
console.log(task._events);
Внутреннее свойство _events содержит объект с
ключами-событиями и массивами привязанных колбэков. Это позволяет
увидеть, какие обработчики активны на конкретной модели или
коллекции.
task.on('all', function(eventName) {
console.log('Событие сработало:', eventName);
});
Событие all срабатывает на любое событие объекта, что
облегчает трассировку последовательности вызовов.
task.on('change', function() {
console.trace('Обработчик change вызван');
});
console.trace выводит стек вызовов, позволяя определить,
откуда произошло триггерное событие.
off может привести к утечкам памяти, особенно при частом
создании и уничтожении представлений:this.model.off('change', this.render, this);
on без очистки предыдущих подписок вызывает множественное
срабатывание:// Ошибка: обработчик будет добавлен каждый раз при вызове init
this.model.on('change', this.render, this);
Исправление: использовать once или проверять
существующие подписки.
this Контекст
обработчика можно задать третьим аргументом on. Без него
this внутри функции может быть не объектом модели или
представления.this.model.on('change', this.render, this); // 'this' ссылается на представление
console.log и
console.trace — быстрый способ понять поток
событий.При разработке крупных приложений стоит структурировать события по
типам объектов и использовать единый подход к
подпискам и очистке. Это минимизирует нежелательные
дублирования и делает систему событий более предсказуемой. Сочетание
on, off, once и события
all позволяет построить прозрачную архитектуру реактивных
компонентов Backbone.js.