Backbone.js предоставляет лёгкий каркас для построения структурированных веб-приложений, основанных на модели MVC (Model-View-Controller) или, точнее, на паттерне MVP (Model-View-Presenter). Основная цель фреймворка — разделение данных, представления и логики приложения, что облегчает поддержку, масштабирование и тестирование кода.
Модель отвечает за управление данными и бизнес-логикой приложения. Backbone.Model предоставляет методы для:
set и получать через
get.validate позволяет
проверять корректность данных перед их установкой.on и
off.Пример создания модели:
var Task = Backbone.Model.extend({
defaults: {
title: '',
completed: false
},
validate: function(attrs) {
if (!attrs.title) {
return "Title cannot be empty";
}
}
});
Модель может взаимодействовать с сервером через встроенный
Backbone.sync, поддерживая CRUD-операции
(create, read, update,
delete) и RESTful API.
Коллекция (Backbone.Collection) — это
упорядоченный набор моделей одного типа. Она обеспечивает:
add,
remove, reset и sort позволяют
автоматически обновлять представления при изменении данных.Пример коллекции:
var TaskList = Backbone.Collection.extend({
model: Task,
comparator: 'title'
});
var tasks = new TaskList();
tasks.add({ title: "Finish project" });
tasks.add({ title: "Write documentation" });
Представление (Backbone.View) отвечает
за отображение данных модели и обработку пользовательских событий.
Основные функции:
events.Пример представления:
var TaskView = Backbone.View.extend({
tagName: 'li',
events: {
'click .toggle': 'toggleCompleted'
},
initialize: function() {
this.listenTo(this.model, 'change', this.render);
},
render: function() {
this.$el.html(this.model.get('title'));
this.$el.toggleClass('completed', this.model.get('completed'));
return this;
},
toggleCompleted: function() {
this.model.set('completed', !this.model.get('completed'));
}
});
Маршрутизатор (Backbone.Router)
управляет состоянием приложения через URL. Он позволяет:
pushState или hash фрагменты.Пример маршрутизатора:
var AppRouter = Backbone.Router.extend({
routes: {
'tasks/:id': 'showTask',
'tasks': 'listTasks'
},
showTask: function(id) {
var task = tasks.get(id);
var view = new TaskView({ model: task });
$('#app').html(view.render().el);
},
listTasks: function() {
var listView = new TaskListView({ collection: tasks });
$('#app').html(listView.render().el);
}
});
Для больших приложений Backbone.js рекомендует разделять код по функциональным слоям:
Структура файлов может выглядеть так:
app/
├── models/
│ └── task.js
├── collections/
│ └── taskList.js
├── views/
│ ├── taskView.js
│ └── taskListView.js
├── routers/
│ └── appRouter.js
├── templates/
│ └── taskTemplate.html
└── app.js
Backbone.js опирается на события для связи компонентов:
Backbone.Events позволяет связывать независимые
компоненты.Пример глобального события:
var dispatcher = _.extend({}, Backbone.Events);
dispatcher.on('task:added', function(task) {
console.log('New task added:', task.get('title'));
});
tasks.on('add', function(task) {
dispatcher.trigger('task:added', task);
});
Такой подход позволяет избегать тесной связности компонентов и упрощает масштабирование приложения.
Для сложных проектов рекомендуется:
Эта структура позволяет Backbone.js оставаться лёгким и гибким инструментом для разработки масштабируемых веб-приложений с чистым и управляемым кодом.