Валидация данных

Backbone.js предоставляет встроенные механизмы для проверки данных в моделях, что позволяет гарантировать корректность состояния объектов до их сохранения или передачи на сервер. Основным инструментом валидации является метод validate, который вызывается автоматически при изменении атрибутов модели через set или при попытке сохранить модель через save.

Метод validate

Метод validate определяется в модели и принимает объект атрибутов, которые подлежат проверке. Его задача — вернуть сообщение об ошибке в случае недопустимых данных или undefined, если все значения корректны. Пример базовой реализации:

var User = Backbone.Model.extend({
    validate: function(attrs) {
        if (!attrs.name || attrs.name.length < 3) {
            return "Имя должно содержать минимум 3 символа";
        }
        if (!attrs.email || !/.+@.+\..+/.test(attrs.email)) {
            return "Некорректный email";
        }
    }
});

В этом примере проверяются два атрибута: name и email. Если хотя бы одно из условий не выполняется, возвращается строка с описанием ошибки.

Вызов валидации при установке атрибутов

Метод set модели автоматически вызывает validate, если передан флаг {validate: true}. Пример:

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

user.set({name: "Al", email: "invalid_email"}, {validate: true});
// Выведет: Ошибка валидации: Имя должно содержать минимум 3 символа

Событие invalid срабатывает только при провале проверки, и его можно использовать для отображения ошибок пользователю или логирования.

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

Метод save также автоматически вызывает validate перед отправкой данных на сервер. Если проверка не проходит, сохранение не выполняется. Пример:

user.save({name: "Bob", email: "bob@example.com"}, {
    validate: true,
    success: function() {
        console.log("Сохранение прошло успешно");
    },
    error: function(model, response) {
        console.log("Ошибка при сохранении:", response);
    }
});

Если атрибуты модели не удовлетворяют условиям, error не вызывается по умолчанию — срабатывает событие invalid.

Кастомизация сообщений об ошибках

В Backbone.js валидация достаточно гибкая. Метод validate может возвращать не только строку, но и объект с множественными ошибками:

var User = Backbone.Model.extend({
    validate: function(attrs) {
        var errors = {};
        if (!attrs.name || attrs.name.length < 3) {
            errors.name = "Имя слишком короткое";
        }
        if (!attrs.email || !/.+@.+\..+/.test(attrs.email)) {
            errors.email = "Некорректный email";
        }
        if (!_.isEmpty(errors)) return errors;
    }
});

Это позволяет удобно работать с формами, где нужно показать несколько ошибок одновременно.

Валидация по событию изменения атрибутов

Можно также выполнять валидацию при каждом изменении отдельного атрибута через слушатели событий change:

user.on("change:name", function(model, value) {
    if (value.length < 3) {
        console.log("Имя слишком короткое");
    }
});

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

Примеры сложной валидации

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

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

Использование таких правил обеспечивает согласованность данных и предотвращает логические ошибки до взаимодействия с сервером или базой данных.

Вывод

Валидация в Backbone.js строится вокруг метода validate и событийной модели invalid. Она позволяет централизованно контролировать корректность данных, предотвращать ошибки на уровне модели и упрощает интеграцию с формами и серверной логикой. Использование объектов для сообщений об ошибках и гибкое управление событиями делает систему валидации мощным инструментом в крупных приложениях.