Backbone.Marionette — это надстройка над Backbone.js, предназначенная для упрощения создания сложных клиентских приложений, структурирования кода и управления жизненным циклом представлений. Она предоставляет расширенные возможности работы с коллекциями, представлениями и регионами интерфейса, минимизируя дублирование кода и повышая читаемость архитектуры.
Application В Marionette приложение создается через
объект Marionette.Application. Он управляет жизненным
циклом приложения, инициализацией модулей и областей интерфейса
(regions). Пример создания приложения:
const MyApp = new Marionette.Application({
region: '#app-container'
});
MyApp.start();
Region Region — это область DOM, в которую можно помещать представления. Основная задача регионов — централизованное управление отображением и очисткой контента.
MyApp.addRegions({
mainRegion: '#main-content'
});
MyApp.mainRegion.show(new MyView());
View Marionette расширяет Backbone.View несколькими типами представлений, упрощающими работу с DOM и коллекциями:
Пример ItemView:
const MyItemView = Marionette.View.extend({
template: _.template('<div><%- name %></div>'),
tagName: 'li'
});
const view = new MyItemView({ model: new Backbone.Model({ name: 'Item 1' }) });
MyApp.mainRegion.show(view);
CollectionView автоматически создает дочерние ItemView для каждой модели в коллекции. Это облегчает работу с повторяющимися элементами интерфейса.
const MyCollectionView = Marionette.CollectionView.extend({
childView: MyItemView
});
const myCollection = new Backbone.Collection([
{ name: 'Item 1' },
{ name: 'Item 2' }
]);
const collectionView = new MyCollectionView({ collection: myCollection });
MyApp.mainRegion.show(collectionView);
CompositeView позволяет объединить шаблон контейнера с коллекцией. Это полезно для списков с заголовком, подвалом или другими статическими элементами.
const MyCompositeView = Marionette.CompositeView.extend({
template: _.template('<h2>Список</h2><ul></ul>'),
childView: MyItemView,
childViewContainer: 'ul'
});
Regions обеспечивают контроль за представлениями, предотвращая утечки памяти и дублирование DOM-элементов. Основные методы:
show(view) — отображение нового представления в
регионе, старое автоматически уничтожается.empty() — удаление текущего представления из
региона.getView() — получение текущего отображаемого
представления.Пример:
MyApp.mainRegion.show(new MyItemView({ model: myModel }));
MyApp.mainRegion.empty();
Marionette поддерживает модульную структуру. Модули позволяют группировать функциональность и управлять зависимостями.
MyApp.module('UserModule', function(UserModule, App, Backbone, Marionette){
UserModule.startWithParent = false;
UserModule.addInitializer(function(){
console.log('UserModule инициализирован');
});
});
MyApp.start();
MyApp.UserModule.start();
Модули могут иметь собственные представления, коллекции и маршруты, при этом взаимодействуя с главным приложением через события.
Marionette расширяет систему событий Backbone, добавляя удобные методы для связи между компонентами:
listenTo — подписка на события других объектов.triggerMethod — безопасное вызов события с
одновременным вызовом метода с именем onEventName.childViewEvents и childViewTriggers —
проксирование событий из дочерних представлений в родительские.Пример использования childViewEvents:
const MyCompositeView = Marionette.CompositeView.extend({
childView: MyItemView,
childViewEvents: {
'click': 'onChildClick'
},
onChildClick(childView, args){
console.log('Нажат элемент:', childView.model.get('name'));
}
});
Marionette поддерживает любые шаблонизаторы, совместимые с Backbone.
Стандартный подход — использование Underscore templates или Handlebars.
Ключевой момент — связывание данных модели с шаблоном через метод
serializeData.
const MyView = Marionette.View.extend({
template: _.template('<p><%- name %></p>'),
serializeData(){
return this.model.toJSON();
}
});
Marionette предоставляет события жизненного цикла:
onBeforeRender и onRender — перед и после
рендеринга.onBeforeAttach и onAttach — перед и после
добавления в DOM.onDestroy — при удалении представления из региона.Это позволяет гибко управлять сторонними плагинами, анимациями и очисткой ресурсов.
Backbone.Marionette существенно упрощает создание масштабируемых и поддерживаемых фронтенд-приложений, сохраняя легковесность Backbone.js.