Model state management

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 мощным инструментом для построения управляемого и предсказуемого состояния приложения.