Backbone.js предоставляет структурированный подход к
управлению состоянием данных приложения через объекты
Model. Модель инкапсулирует данные и бизнес-логику,
позволяя централизованно хранить и изменять состояние, а также
синхронизироваться с сервером.
Для создания модели используется конструктор
Backbone.Model.extend. Основные параметры:
defaults — начальные значения атрибутов модели.initialize — функция инициализации, вызываемая при
создании экземпляра.Пример:
var Task = Backbone.Model.extend({
defaults: {
title: '',
completed: false
},
initialize: function() {
console.log('Новая задача создана');
},
toggle: function() {
this.set('completed', !this.get('completed'));
}
});
Создание экземпляра:
var task1 = new Task({ title: 'Изучить Backbone.js' });
get/setВсе данные модели хранятся в атрибутах. Для работы с ними используются методы:
get(attribute) — получение значения атрибута.set(attribute, value, [options]) — установка значения
атрибута.unset(attribute, [options]) — удаление атрибута.clear([options]) — очистка всех атрибутов модели.Пример использования:
task1.set('title', 'Пройти учебник Backbone.js');
console.log(task1.get('title')); // "Пройти учебник Backbone.js"
Параметр options позволяет контролировать поведение
модели, например, подавлять события:
task1.set('completed', true, { silent: true });
Модели являются объектами с поддержкой событий, что позволяет отслеживать изменения состояния:
change — срабатывает при любом изменении атрибута.change:attribute — срабатывает при изменении
конкретного атрибута.destroy — при удалении модели.sync — после успешной синхронизации с сервером.Пример подписки на события:
task1.on('change:completed', function(model) {
console.log('Статус задачи изменен на', model.get('completed'));
});
task1.set('completed', true);
Backbone позволяет определять правила валидации данных
модели через метод validate. Если метод возвращает
значение, считающееся ошибкой, изменение модели отменяется.
var User = Backbone.Model.extend({
validate: function(attrs) {
if (!attrs.name) {
return 'Имя обязательно для заполнения';
}
if (attrs.age < 0) {
return 'Возраст не может быть отрицательным';
}
}
});
var user = new User();
user.on('invalid', function(model, error) {
console.log('Ошибка валидации:', error);
});
user.set({ age: -5 }, { validate: true }); // Ошибка валидации
Метод save позволяет синхронизировать состояние
модели с сервером:
POST.id, выполняется
PUT.task1.save(); // Отправка на сервер
task1.fetch(); // Получение данных с сервера и обновление модели
task1.destroy(); // Удаление на сервере
Методы принимают options для обработки успеха
(success) или ошибки (error), а также для
подавления событий.
Методы hasChanged, changedAttributes и
previous позволяют следить за историей изменений
атрибутов:
task1.set('title', 'Новое название');
console.log(task1.hasChanged('title')); // true
console.log(task1.previous('title')); // "Пройти учебник Backbone.js"
console.log(task1.changedAttributes()); // { title: "Новое название" }
Эти возможности позволяют строить сложную логику управления состоянием и реагировать на изменения данных.
Модель можно клонировать или преобразовать в JSON для передачи на сервер или локального хранения:
var cloneTask = task1.clone();
console.log(JSON.stringify(task1.toJSON()));
Метод toJSON возвращает чистый объект с атрибутами, не
включая методы модели.
Для моделей, содержащих подмодели или коллекции, важно правильно обновлять вложенные структуры:
var Project = Backbone.Model.extend({
defaults: function() {
return {
name: '',
tasks: new Backbone.Collection()
};
}
});
Использование коллекций в качестве атрибутов модели позволяет
централизованно управлять группами связанных данных и подписываться на
события коллекции (add, remove,
change).
set.Эти принципы делают Backbone.js мощным инструментом для построения управляемого и предсказуемого состояния приложения.