Backbone.js представляет собой lightweight-фреймворк для построения структурированных веб-приложений на JavaScript, основанный на архитектуре MVC (Model-View-Controller). Его основная задача — разделение данных, представления и логики управления, что позволяет создавать масштабируемые приложения с четкой организацией кода.
Фреймворк состоит из нескольких ключевых компонентов: Models, Collections, Views, Routers и Events. Каждый из них выполняет строго определённую роль в приложении, что облегчает поддержку и расширение функционала.
Model в Backbone.js представляет собой структуру данных с бизнес-логикой. Модель хранит состояние объекта и предоставляет методы для его изменения, валидации и синхронизации с сервером.
Ключевые моменты:
attributes — объект для хранения данных, а также методы
get, set для доступа к ним.change, sync,
destroy.validate, который проверяет корректность данных перед их
сохранением.Пример модели:
var Task = Backbone.Model.extend({
defaults: {
title: '',
completed: false
},
validate: function(attrs) {
if (!attrs.title) {
return "Название задачи не может быть пустым.";
}
}
});
Collection представляет собой упорядоченный набор моделей одного типа. Она предоставляет методы для добавления, удаления, сортировки и фильтрации моделей.
Особенности Collections:
fetch,
save, destroy.add, remove,
reset, что позволяет Views реагировать на изменения
коллекции.filter, findWhere, where.Пример коллекции:
var TaskList = Backbone.Collection.extend({
model: Task,
comparator: 'title'
});
var tasks = new TaskList();
tasks.add([{title: 'Написать статью'}, {title: 'Сделать тесты'}]);
View отвечает за отображение данных модели и управление взаимодействием пользователя. В отличие от традиционного MVC, Backbone View не управляет DOM напрямую, а предоставляет интерфейс для его обновления на основе событий.
Основные моменты Views:
render обновляет DOM на основе состояния модели или
коллекции.events, связывая действия пользователя с методами
View.listenTo можно автоматически обновлять интерфейс при
изменении данных.Пример View:
var TaskView = Backbone.View.extend({
tagName: 'li',
template: _.template('<%= title %> <input type="checkbox" <% if (completed) print("checked") %> />'),
events: {
'click input': 'toggleCompleted'
},
initialize: function() {
this.listenTo(this.model, 'change', this.render);
},
render: function() {
this.$el.html(this.template(this.model.toJSON()));
return this;
},
toggleCompleted: function() {
this.model.set('completed', !this.model.get('completed'));
}
});
Router обеспечивает маршрутизацию внутри одностраничного приложения. Он связывает URL с конкретными действиями в приложении.
Особенности:
routes.Backbone.history для отслеживания истории
браузера и работы с pushState.Пример Router:
var AppRouter = Backbone.Router.extend({
routes: {
'tasks/:id': 'showTask',
'*path': 'defaultRoute'
},
showTask: function(id) {
console.log('Показ задачи с id:', id);
},
defaultRoute: function() {
console.log('Главная страница');
}
});
var router = new AppRouter();
Backbone.history.start();
Backbone.js использует собственную систему событий для связи моделей,
коллекций и представлений. Любой объект может расширить
Backbone.Events, что делает приложение более
реактивным.
Методы событий:
on(event, callback, context) — подписка на
событие.off(event, callback, context) — отмена подписки.trigger(event, ...) — вызов события с передачей
аргументов.Пример использования:
var dispatcher = {};
_.extend(dispatcher, Backbone.Events);
dispatcher.on('task:added', function(task) {
console.log('Добавлена задача:', task.get('title'));
});
dispatcher.trigger('task:added', new Task({title: 'Учить Backbone.js'}));
Backbone предоставляет стандартный метод sync, который
интегрирует модели и коллекции с RESTful API. Он поддерживает
CRUD-операции:
create — создание нового ресурса.read — получение данных с сервера.update — обновление существующего ресурса.delete — удаление ресурса.Метод fetch используется для загрузки данных коллекции
или модели, а save — для отправки изменений на сервер.
Backbone.js позволяет создавать веб-приложения с чистой архитектурой, упрощает поддержку кода и масштабирование проектов, сохраняя при этом контроль над всеми аспектами взаимодействия с данными и интерфейсом.