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.js, обеспечивая контроль за состоянием моделей и согласованность данных в приложении.