Backbone.js строится вокруг принципов событийно-ориентированной архитектуры, которая позволяет компонентам приложения взаимодействовать между собой без жёсткой привязки. Это делает код гибким, модульным и удобным для расширения.
В Backbone.js все ключевые сущности — Models,
Collections, Views — наследуют
функциональность событийного механизма через объект
Backbone.Events. Это позволяет:
on.once.off.trigger.Пример базового использования:
var obj = {};
_.extend(obj, Backbone.Events);
obj.on('change:name', function(newName) {
console.log('Имя изменено на', newName);
});
obj.trigger('change:name', 'Алексей');
В этом примере объект получает возможность работать с событиями, хотя изначально это обычный объект JavaScript.
Модели в Backbone.js инкапсулируют данные и бизнес-логику. События позволяют отслеживать изменения состояния модели:
change — срабатывает при любом изменении атрибутов
модели.change:attribute — срабатывает при изменении
конкретного атрибута.destroy — срабатывает при удалении модели.sync — срабатывает после успешного сохранения на
сервере.error — срабатывает при ошибке взаимодействия с
сервером.Пример:
var User = Backbone.Model.extend({});
var user = new User({name: 'Иван', age: 25});
user.on('change:name', function(model, value) {
console.log('Новое имя:', value);
});
user.set('name', 'Сергей'); // В консоли: "Новое имя: Сергей"
Метод set вызывает событие change
автоматически, что позволяет синхронизировать представления с состоянием
модели.
Коллекции представляют собой упорядоченные наборы моделей. Backbone.js предоставляет события, связанные с добавлением, удалением и изменением моделей:
add — при добавлении модели.remove — при удалении модели.reset — при полной замене содержимого коллекции.sort — при изменении порядка моделей.update — общий сигнал, объединяющий события
add, remove и change.Пример:
var Users = Backbone.Collection.extend({ model: User });
var users = new Users();
users.on('add', function(model) {
console.log('Добавлен пользователь:', model.get('name'));
});
users.add(new User({name: 'Анна'})); // В консоли: "Добавлен пользователь: Анна"
События коллекций позволяют автоматически обновлять пользовательский интерфейс при изменении набора данных.
Views отвечают за отображение данных и реакцию на действия пользователя. Они используют два вида событий:
events:var UserView = Backbone.View.extend({
tagName: 'li',
events: {
'click .edit': 'editUser'
},
editUser: function() {
console.log('Редактирование пользователя');
}
});
var userView = new UserView({model: user});
userView.listenTo(user, 'change:name', function(model) {
console.log('Имя пользователя обновлено в представлении:', model.get('name'));
});
Использование listenTo предпочтительнее, чем
on, так как обеспечивает автоматическое отсоединение
событий при уничтожении view с помощью метода
stopListening.
listenTo и stopListening предотвращает утечки
памяти при удалении view.listenToOnce — аналог once для
listenTo.context) для коллбэков.obj.on('change reset', callback).Событийная архитектура Backbone.js тесно связана с асинхронными операциями:
fetch вызывает request к серверу и
по завершении генерирует события sync или
error.save сохраняет модель и уведомляет слушателей о
результатах.destroy удаляет модель с сервера и генерирует
соответствующие события.Событийно-ориентированный подход позволяет отделять логику бизнес-процессов от логики интерфейса, делая приложение более управляемым и расширяемым.
listenTo для управления временем жизни
подписок в view.Событийная архитектура Backbone.js является фундаментом для построения реактивных, модульных и поддерживаемых JavaScript-приложений, обеспечивая строгую организацию взаимодействия между компонентами без сильной связности.