Атрибуты и их валидация

Backbone.js предоставляет мощный механизм работы с данными через объекты Model. Каждый экземпляр модели хранит набор атрибутов, представляющих состояние объекта, и обеспечивает методы для их управления, отслеживания изменений и валидации.


Управление атрибутами

Атрибуты модели хранятся во внутреннем объекте attributes. Для доступа и изменения используется набор методов:

  • get(attr) — возвращает значение атрибута attr.
  • set(attr, value, [options]) — устанавливает значение атрибута attr. Опционально можно передавать объект с параметрами, такими как silent для подавления событий изменения или validate для проверки данных.
  • unset(attr, [options]) — удаляет атрибут из модели.
  • has(attr) — проверяет наличие атрибута в модели.
  • clear([options]) — удаляет все атрибуты модели.

Пример использования:

var Book = Backbone.Model.extend({});

var myBook = new Book({title: "1984", author: "George Orwell"});

// Чтение атрибутов
console.log(myBook.get("title")); // "1984"

// Изменение атрибута
myBook.set("title", "Animal Farm");

// Проверка наличия атрибута
console.log(myBook.has("publisher")); // false

// Удаление атрибута
myBook.unset("author");

События изменения атрибутов

Backbone позволяет реагировать на изменения атрибутов через систему событий:

  • change — срабатывает при изменении любого атрибута.
  • change:attr — срабатывает при изменении конкретного атрибута attr.
  • invalid — срабатывает, если попытка установки атрибута не прошла валидацию.

Пример:

var User = Backbone.Model.extend({
    defaults: {
        name: '',
        age: 0
    }
});

var user = new User();

user.on("change:name", function(model, value) {
    console.log("Имя изменено на", value);
});

user.set("name", "Alice"); // "Имя изменено на Alice"

Валидация атрибутов

Backbone поддерживает встроенный механизм валидации через метод validate. Метод вызывается при попытке установки атрибутов через set и при сохранении модели через save.

Принцип работы:

  • Метод validate(attrs, options) получает объект атрибутов attrs, которые собираются установить.
  • Если валидация проходит успешно, метод должен возвращать undefined.
  • Если данные некорректны, метод возвращает строку с сообщением об ошибке.

Пример валидации:

var Product = Backbone.Model.extend({
    validate: function(attrs) {
        if (!attrs.name) {
            return "Название продукта обязательно";
        }
        if (attrs.price < 0) {
            return "Цена не может быть отрицательной";
        }
    }
});

var product = new Product();

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

product.set({name: "", price: -10}, {validate: true});
// "Ошибка валидации: Название продукта обязательно"

Валидация при сохранении модели

Метод save также вызывает validate, если передан объект options с параметром validate: true:

product.save({name: "Laptop", price: 1500}, {validate: true});

Если валидация не прошла, сохранение не выполняется, и событие invalid срабатывает автоматически.


Кастомные правила валидации

Для сложных правил можно использовать несколько проверок и возвращать объект с множественными ошибками:

var UserProfile = Backbone.Model.extend({
    validate: function(attrs) {
        var errors = {};
        if (!attrs.username) errors.username = "Имя пользователя обязательно";
        if (!attrs.email) errors.email = "Email обязателен";
        if (Object.keys(errors).length) return errors;
    }
});

var profile = new UserProfile();

profile.on("invalid", function(model, errors) {
    console.log(errors);
});

profile.set({username: ""}, {validate: true});
// { username: "Имя пользователя обязательно", email: "Email обязателен" }

Связь между атрибутами и представлениями

Валидация атрибутов и отслеживание их изменений тесно связаны с View. Изменения модели автоматически могут отражаться в интерфейсе через привязку событий:

var UserView = Backbone.View.extend({
    initialize: function() {
        this.listenTo(this.model, "change", this.render);
    },
    render: function() {
        this.$el.text("Имя: " + this.model.get("name"));
        return this;
    }
});

var user = new User({name: "Bob"});
var view = new UserView({model: user, el: "#user"});
user.set("name", "Charlie"); // интерфейс обновится автоматически

Резюме ключевых моментов

  • Атрибуты модели хранятся в объекте attributes и управляются через get, set, unset, has и clear.
  • События change и change:attr позволяют реагировать на изменения данных.
  • Метод validate обеспечивает проверку корректности данных перед их установкой.
  • Ошибки валидации вызывают событие invalid.
  • Валидация интегрируется с сохранением данных через save.
  • Система событий Backbone позволяет автоматически обновлять представления при изменении модели.

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