Composite View — это паттерн, используемый для организации сложных пользовательских интерфейсов, состоящих из множества вложенных представлений. Он помогает управлять жизненным циклом дочерних представлений, поддерживать чистую структуру кода и избегать утечек памяти, типичных для крупных Backbone-приложений.
В Backbone.js каждая View отвечает за один фрагмент DOM и за управление событиями этого фрагмента. Когда интерфейс становится сложным, с вложенными компонентами и коллекциями, обычные представления перестают быть удобными. Composite View решает эту проблему, предоставляя следующие возможности:
Composite View строится на принципах агрегации:
Пример структуры:
ParentView
├─ HeaderView
├─ ListView
│ ├─ ListItemView
│ ├─ ListItemView
│ └─ ListItemView
└─ FooterView
var ParentView = Backbone.View.extend({
initialize: function(options) {
this.childViews = [];
this.collection = options.collection;
this.listenTo(this.collection, 'add', this.addChild);
this.listenTo(this.collection, 'reset', this.renderChildren);
},
addChild: function(model) {
var childView = new ListItemView({ model: model });
this.childViews.push(childView);
this.$el.append(childView.render().el);
},
renderChildren: function() {
this.removeChildren();
this.collection.each(this.addChild, this);
},
removeChildren: function() {
this.childViews.forEach(function(view) {
view.remove();
});
this.childViews = [];
},
render: function() {
this.renderChildren();
return this;
}
});
Composite View позволяет автоматически обновлять DOM при изменении
коллекции или модели, используя методы addChild,
removeChildren и события add,
remove, reset.
Для предотвращения конфликтов и утечек памяти:
listenTo вместо on для
привязки событий.stopListening в методе remove
родительского представления.remove: function() {
this.removeChildren();
this.stopListening();
Backbone.View.prototype.remove.call(this);
}
Пример проксирования событий:
var ListItemView = Backbone.View.extend({
events: {
'click .delete': 'deleteItem'
},
deleteItem: function() {
this.trigger('item:deleted', this.model);
}
});
var ListView = Backbone.View.extend({
initialize: function() {
this.listenTo(this.childViews, 'item:deleted', this.removeItem);
},
removeItem: function(model) {
this.collection.remove(model);
}
});
remove.Composite View pattern является фундаментальным инструментом для создания масштабируемых Backbone-приложений, где интерфейсы состоят из множества взаимосвязанных компонентов. Его применение обеспечивает надежное управление состоянием и структурой представлений, упрощает поддержку кода и повышает производительность.