У меня есть установка вложенных представлений, которая может быть несколько глубокой в моем приложении. Есть несколько способов, которые я мог бы придумать для инициализации, рендеринга и добавления под-представлений, но мне интересно, что такое обычная практика.
Вот пара, о которой я подумал:
initialize : function () {
this.subView1 = new Subview({options});
this.subView2 = new Subview({options});
},
render : function () {
this.$el.html(this.template());
this.subView1.setElement('.some-el').render();
this.subView2.setElement('.some-el').render();
}
Плюсы: Вам не нужно беспокоиться о сохранении правильного порядка DOM с добавлением. Представления сначала инициализируются, поэтому в функции рендеринга не так много всего.
Минусы: Вы вынуждены повторно делегироватьEvents(), что может быть дорогостоящим? Функция рендеринга родительского представления загромождена всем рендерингом subview, который должен произойти? У вас нет возможности установить tagName
элементов, поэтому шаблон должен поддерживать правильные имена тегов.
Другой способ:
initialize : function () {
},
render : function () {
this.$el.empty();
this.subView1 = new Subview({options});
this.subView2 = new Subview({options});
this.$el.append(this.subView1.render().el, this.subView2.render().el);
}
Плюсы: Вам не нужно повторно делегировать события. Вам не нужен шаблон, который содержит только пустые заполнители, и ваше tagName вернется к определению.
Минусы: Теперь вам нужно обязательно добавить вещи в правильном порядке. Родительский рендеринг представления по-прежнему загроможден для рендеринга subview.
С событием onRender
:
initialize : function () {
this.on('render', this.onRender);
this.subView1 = new Subview({options});
this.subView2 = new Subview({options});
},
render : function () {
this.$el.html(this.template);
//other stuff
return this.trigger('render');
},
onRender : function () {
this.subView1.setElement('.some-el').render();
this.subView2.setElement('.some-el').render();
}
Плюсы: Теперь логика subview отделена от метода view render()
.
С событием onRender
:
initialize : function () {
this.on('render', this.onRender);
},
render : function () {
this.$el.html(this.template);
//other stuff
return this.trigger('render');
},
onRender : function () {
this.subView1 = new Subview();
this.subView2 = new Subview();
this.subView1.setElement('.some-el').render();
this.subView2.setElement('.some-el').render();
}
У меня есть разновидность и сочетается с кучей разных практик во всех этих примерах (так жаль, что), но какие из них вы бы сохранили или добавили? и что бы вы не сделали?
Краткое описание практики:
- Мгновенное создание подпрограмм в
initialize
или вrender
? - Выполните всю логику рендеринга суб-представления в
render
или вonRender
? - Используйте
setElement
илиappend/appendTo
?