Концепция моделей данных

В основе Backbone.js лежит концепция моделей данных, которые представляют сущности приложения и управляют их состоянием. Модель инкапсулирует данные и предоставляет интерфейс для их изменения, валидации и синхронизации с сервером.

Определение модели осуществляется через расширение класса Backbone.Model:

var Task = Backbone.Model.extend({
    defaults: {
        title: '',
        completed: false
    },
    validate: function(attrs) {
        if (!attrs.title) {
            return "Название задачи не может быть пустым";
        }
    },
    toggle: function() {
        this.set('completed', !this.get('completed'));
    }
});
  • defaults задаёт начальные значения атрибутов модели.
  • validate обеспечивает проверку данных перед их установкой. Если возвращается строка ошибки, изменения не применяются.
  • Методы модели, такие как toggle, могут инкапсулировать бизнес-логику, связанную с сущностью.

Создание экземпляра модели:

var task = new Task({ title: 'Изучить Backbone.js' });

При создании модели можно передавать атрибуты, которые заменят значения по умолчанию.

Атрибуты и методы работы с ними

Модель предоставляет методы get и set для работы с атрибутами:

task.set('completed', true);
console.log(task.get('title')); // "Изучить Backbone.js"

Метод set может принимать объект с несколькими атрибутами:

task.set({ title: 'Изучить JavaScript', completed: false });

События моделей позволяют реагировать на изменения:

task.on('change:completed', function(model, completed) {
    console.log('Статус задачи изменён на', completed);
});

Метод on привязывает обработчик к событию изменения конкретного атрибута. Можно использовать события change, destroy, invalid для различных случаев жизненного цикла модели.

Синхронизация с сервером

Backbone модели могут автоматически взаимодействовать с сервером через методы fetch, save и destroy:

task.save(); // POST или PUT на сервер
task.fetch(); // GET с сервера, обновление атрибутов
task.destroy(); // DELETE на сервере

Методы используют объект url модели для определения адреса запроса. Можно задать urlRoot или функцию url, возвращающую динамический путь:

var Task = Backbone.Model.extend({
    urlRoot: '/tasks'
});

Методы save и fetch возвращают объект jqXHR, что позволяет обрабатывать успешные и неуспешные запросы через .done() и .fail().

Валидация и события ошибок

Валидация модели запускается автоматически при вызове set или save. Если данные не проходят проверку, срабатывает событие invalid:

task.on('invalid', function(model, error) {
    console.log('Ошибка валидации:', error);
});

task.set({ title: '' }, { validate: true });

Параметр { validate: true } обязателен, если требуется выполнить проверку при установке атрибутов.

Управление состоянием модели

Модели могут иметь вспомогательные методы для удобного управления состоянием:

var Task = Backbone.Model.extend({
    toggle: function() {
        this.set('completed', !this.get('completed'));
    },
    isCompleted: function() {
        return this.get('completed');
    }
});

task.toggle();
console.log(task.isCompleted()); // true

Такой подход позволяет инкапсулировать логику работы с данными внутри модели, минимизируя дублирование кода.

Ключевые особенности моделей Backbone.js

  • Инкапсуляция данных — все свойства и логика работы с ними сосредоточены в модели.
  • Событийная система — модели могут уведомлять о любых изменениях своих атрибутов.
  • Синхронизация с сервером — встроенные методы позволяют легко взаимодействовать с REST API.
  • Валидация — предотвращает некорректные данные и обеспечивает целостность модели.
  • Расширяемость — собственные методы и вспомогательные функции позволяют моделям реализовывать бизнес-логику приложения.

Модели Backbone.js становятся ядром структуры данных приложения, обеспечивая стабильное, предсказуемое управление состоянием и эффективное взаимодействие с серверной частью.