Backbone.js предоставляет минималистичный каркас для построения
клиентских приложений, но не включает встроенную мощную систему
валидации. Основной инструмент для проверки данных в Backbone — метод
validate, который можно определить в
модели. Этот метод вызывается автоматически при вызове методов
save или
set, если указана опция
validate: true.
Сигнатура метода validate:
var User = Backbone.Model.extend({
validate: function(attrs) {
var errors = {};
if (!attrs.name) {
errors.name = "Имя обязательно";
}
if (attrs.age && attrs.age < 0) {
errors.age = "Возраст не может быть отрицательным";
}
if (!_.isEmpty(errors)) {
return errors;
}
}
});
validate возвращает объект
ошибок или undefined.invalid срабатывает при
неудачной валидации, предоставляя возможность реагировать на
ошибки.var user = new User();
user.on("invalid", function(model, errors) {
console.log(errors);
});
user.set({ age: -5 }, { validate: true });
Для крупных приложений ручное написание всех правил валидации становится неудобным. На практике используются внешние библиотеки, интегрируемые с Backbone, которые упрощают управление правилами и ошибками.
Популярные библиотеки:
Backbone.Validation Позволяет декларативно задавать правила валидации для атрибутов модели.
_.extend(Backbone.Model.prototype, Backbone.Validation.mixin);
var User = Backbone.Model.extend({
validation: {
name: {
required: true,
msg: "Имя обязательно"
},
email: {
pattern: 'email',
msg: "Неверный формат email"
},
age: {
min: 0,
msg: "Возраст не может быть отрицательным"
}
}
});
var user = new User();
user.bind('validated:invalid', function(model, errors) {
console.log(errors);
});
user.set({ email: "wrong" }, { validate: true });
Основные преимущества:
Backbone.View.Parsley.js (через адаптеры) Можно использовать для сложной клиентской валидации, включая асинхронные проверки. Подходит для форм с динамическими правилами, хотя требует интеграционного кода с Backbone.
Validator.js Чисто функциональная библиотека для
проверки значений, которую удобно использовать внутри метода
validate. Пример интеграции:
var User = Backbone.Model.extend({
validate: function(attrs) {
var errors = {};
if (!validator.isEmail(attrs.email || "")) {
errors.email = "Неверный формат email";
}
if (!_.isEmpty(errors)) return errors;
}
});Backbone не поддерживает асинхронные проверки напрямую, но их можно реализовать через промисы или коллбеки.
Пример проверки уникальности email через сервер:
var User = Backbone.Model.extend({
validate: function(attrs, options) {
if (!attrs.email) return { email: "Email обязателен" };
if (options.async) {
return fetch('/api/check-email?email=' + encodeURIComponent(attrs.email))
.then(response => response.json())
.then(data => {
if (!data.available) {
this.trigger("invalid", this, { email: "Email уже занят" });
}
});
}
}
});
var user = new User();
user.set({ email: "test@example.com" }, { validate: true, async: true });
Ошибки валидации можно автоматически отображать в представлениях:
var UserView = Backbone.View.extend({
initialize: function() {
this.listenTo(this.model, "validated:invalid", this.showErrors);
},
showErrors: function(model, errors) {
for (var key in errors) {
this.$('[name=' + key + ']').addClass('error').after('<span>' + errors[key] + '</span>');
}
}
});
Преимущество такого подхода — разделение логики модели и отображения ошибок, что повышает масштабируемость приложения.
validate:
подходят для динамических или сложных зависимостей между
атрибутами.Для многоязычных приложений рекомендуется хранить тексты ошибок в отдельных ресурсах:
var messages = {
en: { required: "Required", email: "Invalid email" },
ru: { required: "Обязательно", email: "Неверный формат email" }
};
var User = Backbone.Model.extend({
validation: {
name: { required: true, msg: messages.ru.required },
email: { pattern: 'email', msg: messages.ru.email }
}
});
Это упрощает поддержку и переключение языков в интерфейсе без изменения логики валидации.
save.invalid и
validated:valid для синхронизации с интерфейсом.Backbone.Validation, Validator.js)
вместо ручного кодирования всех проверок.Эта архитектура позволяет создавать масштабируемые, надежные приложения на Backbone.js с централизованной и расширяемой системой валидации.