Backbone.js предоставляет мощный механизм для организации данных и их взаимодействия с пользовательским интерфейсом через модели. Модель в Backbone.js — это объект, который инкапсулирует данные, их валидацию и бизнес-логику. Каждая модель представляет собой отдельную единицу данных, с которой можно работать независимо.
Создание модели начинается с расширения базового класса
Backbone.Model:
var Person = Backbone.Model.extend({
defaults: {
name: 'Неизвестно',
age: 0
},
initialize: function() {
console.log('Новая модель создана');
},
greet: function() {
return 'Привет, меня зовут ' + this.get('name');
}
});
Ключевые моменты:
defaults — задаёт значения по
умолчанию для атрибутов модели.initialize — вызывается при создании
экземпляра модели.Создание экземпляра модели:
var person1 = new Person({ name: 'Иван', age: 25 });
console.log(person1.greet()); // Привет, меня зовут Иван
Если атрибут не передан при создании, используется значение из
defaults.
Для работы с данными модели Backbone.js предоставляет методы:
get(attr) — получает значение
атрибута.set(attr, value) — устанавливает
значение атрибута.unset(attr) — удаляет атрибут.clear() — удаляет все атрибуты.toJSON() — возвращает копию всех
атрибутов в виде обычного объекта JavaScript.Пример использования:
person1.set('age', 26);
console.log(person1.get('age')); // 26
person1.unset('name');
console.log(person1.get('name')); // undefined
Backbone.js позволяет добавлять в модели валидацию через метод
validate:
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 });
Особенности:
validate вызывается при попытке установить новые
атрибуты.validate возвращает строку ошибки, изменение
данных не применяется.invalid позволяет обрабатывать ошибки
централизованно.Backbone.js поддерживает иерархическое наследование
моделей через метод extend. Это позволяет создавать
специализированные модели на основе базовых:
var Employee = Person.extend({
defaults: function() {
return _.extend({}, Person.prototype.defaults, {
position: 'Сотрудник'
});
},
work: function() {
return this.get('name') + ' выполняет свои обязанности как ' + this.get('position');
}
});
var employee1 = new Employee({ name: 'Анна', age: 30 });
console.log(employee1.work()); // Анна выполняет свои обязанности как Сотрудник
Примечания:
defaults можно использовать функцию для объединения
базовых значений с новыми атрибутами.extend может использоваться
многократно для создания глубокой иерархии моделей.Модели Backbone.js интегрированы с системой событий, что позволяет отслеживать изменения данных:
change — вызывается при любом
изменении атрибутов.change:attr — вызывается при изменении
конкретного атрибута.destroy — вызывается при удалении
модели.sync — вызывается после успешной
синхронизации с сервером.Пример использования событий:
person1.on('change:age', function(model, value) {
console.log('Возраст изменился на ' + value);
});
person1.set('age', 27); // Возраст изменился на 27
Модели Backbone.js могут синхронизироваться с сервером с помощью стандартных методов:
fetch() — загружает данные с
сервера.save() — сохраняет данные модели на
сервер.destroy() — удаляет модель с
сервера.Пример:
var user = new Person({ id: 1 });
user.fetch({
success: function(model, response) {
console.log('Данные загружены', response);
}
});
user.save({ age: 28 });
user.destroy();
Используется RESTful API, где Backbone автоматически
определяет HTTP-методы (GET, POST,
PUT, DELETE) для операций с моделью.
Создание и наследование моделей Backbone.js позволяет:
Эта структура делает Backbone.js удобным инструментом для построения SPA-приложений, где модели являются сердцем архитектуры и обеспечивают надёжное управление состоянием.