Backbone.js предоставляет структуру для организации интерфейсов, где ключевую роль играют представления (Views). Представления в Backbone.js отвечают за отображение данных моделей и коллекций, обработку пользовательских событий и управление DOM. Они не хранят состояние приложения, за исключением внутреннего состояния, необходимого для рендеринга.
Представления создаются с помощью Backbone.View.extend,
что позволяет определить собственное поведение и настройки:
var TodoView = Backbone.View.extend({
tagName: 'li',
className: 'todo-item',
template: _.template($('#todo-template').html()),
events: {
'click .toggle': 'toggleCompleted',
'click .delete': 'removeItem'
},
initialize: function() {
this.listenTo(this.model, 'change', this.render);
this.listenTo(this.model, 'destroy', this.remove);
},
render: function() {
this.$el.html(this.template(this.model.toJSON()));
return this;
},
toggleCompleted: function() {
this.model.toggle();
},
removeItem: function() {
this.model.destroy();
}
});
Ключевые моменты:
tagName, className, id
позволяют определить HTML-структуру элемента.template — функция для генерации HTML на основе данных
модели.events — объект, связывающий DOM-события с методами
представления.initialize используется для настройки слушателей
событий модели или коллекции.render отвечает за генерацию и обновление
DOM-контента.Backbone.js использует событийную модель, которая позволяет представлению реагировать на изменения модели и коллекции. Основные методы:
listenTo(object, event, callback) — подписка на события
с автоматическим управлением памятью.stopListening() — прекращение всех подписок.on(event, callback, context) — классический способ
подписки.Пример взаимодействия представления с моделью:
initialize: function() {
this.listenTo(this.model, 'change:completed', this.updateStatus);
},
updateStatus: function() {
this.$('.status').toggleClass('done', this.model.get('completed'));
}
Представления могут работать с коллекциями для отображения списков элементов. Обычно создается родительское представление, которое рендерит дочерние представления для каждой модели:
var TodoListView = Backbone.View.extend({
initialize: function() {
this.listenTo(this.collection, 'add', this.addOne);
this.listenTo(this.collection, 'reset', this.addAll);
},
render: function() {
this.addAll();
return this;
},
addOne: function(todo) {
var view = new TodoView({ model: todo });
this.$el.append(view.render().el);
},
addAll: function() {
this.$el.empty();
this.collection.each(this.addOne, this);
}
});
Особенности работы с коллекциями:
add, remove,
reset позволяет автоматически обновлять интерфейс при
изменении данных.Backbone.js ориентирован на ручное управление DOM, что дает полный контроль, но требует внимания к производительности. Рекомендуется:
this.$('.selector').DocumentFragment для массовой вставки
элементов.Пример оптимизированного рендера списка:
addAll: function() {
var fragment = document.createDocumentFragment();
this.collection.each(function(todo) {
var view = new TodoView({ model: todo });
fragment.appendChild(view.render().el);
});
this.$el.empty().append(fragment);
}
Backbone.View предоставляет возможности для создания абстрактных представлений и повторного использования логики:
extend.Пример базового класса:
var BaseView = Backbone.View.extend({
show: function() {
this.$el.show();
},
hide: function() {
this.$el.hide();
}
});
var DetailedTodoView = BaseView.extend({
render: function() {
this.$el.html(this.model.get('title'));
return this;
}
});
Основная задача представления — синхронизация DOM с моделью. Backbone.js не навязывает строгой привязки данных, но позволяет организовать реактивное обновление через события. Это дает:
Представления в Backbone.js являются мостом между данными и интерфейсом, обеспечивая:
Архитектура представлений позволяет строить масштабируемые и управляемые интерфейсы, где каждое представление отвечает за конкретный фрагмент пользовательского интерфейса, а взаимодействие с моделями и коллекциями реализуется через событийную систему.