Backbone.js предоставляет минималистичный, но мощный каркас для построения клиентских приложений на JavaScript, ориентируясь на разделение данных, логики и представления. Одним из ключевых компонентов этого подхода является система рендеринга и шаблонизации, позволяющая управлять отображением данных из моделей и коллекций на интерфейсе пользователя.
View в Backbone.js отвечает за отображение данных и обработку пользовательских событий. Основные задачи представления включают:
Простейшая структура представления:
var ItemView = Backbone.View.extend({
tagName: 'li',
className: 'item',
template: _.template($('#item-template').html()),
render: function() {
this.$el.html(this.template(this.model.toJSON()));
return this;
}
});
Ключевые моменты:
tagName и className позволяют задавать
структуру создаваемого элемента.template использует функцию _.template из
Underscore.js для преобразования данных в HTML.render отвечает за непосредственный рендеринг
данных в DOM. Использование this.model.toJSON()
обеспечивает получение чистого объекта с данными модели.Backbone.js не включает собственную систему шаблонов, вместо этого
полагается на Underscore.js, предоставляющий функцию
_.template. Синтаксис шаблонов позволяет вставлять данные
модели и выполнять простые логические операции:
<script type="text/template" id="item-template">
<h3><%= title %></h3>
<p><%= description %></p>
<% if (completed) { %>
<span class="done">Выполнено</span>
<% } else { %>
<span class="pending">В процессе</span>
<% } %>
</script>
Особенности синтаксиса:
<%= ... %> — вставка значения с экранированием
HTML.<%- ... %> — вставка значения без
экранирования.<% ... %> — выполнение JavaScript кода без вывода
результата.Для отображения множества моделей используется отдельное представление коллекции, которое управляет рендерингом каждого элемента:
var ListView = Backbone.View.extend({
el: '#list-container',
initialize: function() {
this.listenTo(this.collection, 'add remove reset', this.render);
},
render: function() {
this.$el.empty();
this.collection.each(function(model) {
var itemView = new ItemView({ model: model });
this.$el.append(itemView.render().el);
}, this);
return this;
}
});
Особенности:
listenTo позволяет подписаться на события
коллекции и автоматически обновлять интерфейс при изменении данных.ItemView.empty() очищает контейнер перед повторным
рендерингом, чтобы избежать дублирования элементов.Backbone.js поддерживает автоматическое обновление интерфейса при изменении модели:
var ItemView = Backbone.View.extend({
initialize: function() {
this.listenTo(this.model, 'change', this.render);
},
render: function() {
this.$el.html(this.template(this.model.toJSON()));
return this;
}
});
Событие change срабатывает при изменении любых атрибутов
модели, обеспечивая синхронизацию данных и интерфейса без ручного
вмешательства.
Для более сложных приложений используется композиция представлений:
Пример интеграции подвидов:
var ParentView = Backbone.View.extend({
render: function() {
var childView = new ChildView({ model: this.model });
this.$el.append(childView.render().el);
return this;
}
});
Рендеринг большого количества элементов требует оптимизации:
DocumentFragment или
innerHTML для пакетной вставки элементов в DOM.listenToOnce, change:attribute).Backbone.js предоставляет гибкий механизм отображения данных через представления и шаблоны. Ключевые принципы:
Эта система рендеринга позволяет создавать масштабируемые и поддерживаемые клиентские приложения с чистой архитектурой и управляемым потоком данных.