В Backbone.js валидация данных реализуется на уровне
моделей с использованием метода validate. Метод вызывается
автоматически при вызове методов set и save и
позволяет определить правила проверки для атрибутов модели. Если
валидация не проходит, метод должен возвращать строку с описанием
ошибки.
Пример базовой валидации:
var User = Backbone.Model.extend({
defaults: {
name: '',
email: ''
},
validate: function(attrs) {
var errors = {};
if (!attrs.name || attrs.name.trim() === '') {
errors.name = 'Имя не может быть пустым';
}
if (!attrs.email || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(attrs.email)) {
errors.email = 'Некорректный формат email';
}
if (!_.isEmpty(errors)) {
return errors;
}
}
});
var user = new User();
user.on('invalid', function(model, errors) {
console.log(errors);
});
user.set({ name: '', email: 'wrong-email' }, { validate: true });
В примере:
validate проверяет атрибуты name и
email.invalid активируется с
объектом ошибок.validate: true при set или
save обязательно для запуска валидации.Backbone.js предоставляет события, связанные с валидацией:
invalid — вызывается при ошибке валидации.change — вызывается при успешном изменении атрибутов
после успешной валидации.Можно подписываться на эти события для реализации динамического отображения ошибок на интерфейсе.
user.on('invalid', function(model, errors) {
for (var key in errors) {
console.log(key + ': ' + errors[key]);
}
});
Санация данных необходима для защиты от XSS, SQL-инъекций и некорректного ввода. Backbone.js не предоставляет встроенных средств для санирования, поэтому его реализуют через вспомогательные функции или сторонние библиотеки, например, DOMPurify для очистки HTML.
Пример простой санации перед установкой атрибутов:
var sanitize = function(str) {
return str.replace(/</g, '<').replace(/>/g, '>').trim();
};
var Post = Backbone.Model.extend({
defaults: {
title: '',
content: ''
},
setSanitized: function(attrs, options) {
if (attrs.title) attrs.title = sanitize(attrs.title);
if (attrs.content) attrs.content = sanitize(attrs.content);
this.set(attrs, options);
}
});
var post = new Post();
post.setSanitized({ title: '<script>alert(1)</script>', content: ' text ' });
console.log(post.toJSON());
// Результат: { title: '<script>alert(1)</script>', content: 'text' }
Коллекции в Backbone.js могут содержать модели, каждая из которых проходит собственную валидацию. Дополнительно можно валидировать коллекцию целиком, проверяя уникальность значений или общие ограничения.
var Users = Backbone.Collection.extend({
model: User,
validateAll: function() {
var errors = [];
this.each(function(user) {
var err = user.validate(user.attributes);
if (err) errors.push({ user: user, errors: err });
});
return errors.length ? errors : null;
}
});
var users = new Users([
{ name: 'Alice', email: 'alice@example.com' },
{ name: '', email: 'invalid-email' }
]);
var collectionErrors = users.validateAll();
console.log(collectionErrors);
{ validate: true } при
set и save — без неё метод
validate не срабатывает.Иногда проверка данных требует обращения к серверу. Backbone.js
позволяет использовать метод save с серверной валидацией,
обрабатывая ошибки через колбэки error.
user.save(null, {
success: function(model, response) {
console.log('Данные сохранены');
},
error: function(model, response) {
console.log('Ошибка сервера:', response.responseText);
}
});
Асинхронная валидация может комбинироваться с локальной: сначала
проверяются формальные требования (validate), затем
отправляется запрос на сервер для проверки уникальности или
существования данных.
save с
{ validate: true } — запуск локальной валидации.invalid, change
для реактивного управления состоянием.success/error.Эффективная комбинация этих механизмов обеспечивает корректность, консистентность и безопасность данных в приложениях на Backbone.js.