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. Она позволяет централизованно
контролировать корректность данных, предотвращать ошибки на уровне
модели и упрощает интеграцию с формами и серверной логикой.
Использование объектов для сообщений об ошибках и гибкое управление
событиями делает систему валидации мощным инструментом в крупных
приложениях.