У меня есть приложение, которое backbone.marionette с помощью CollectionView для вывода следующего:Создать представление элементов сиблинга с помощью CollectionView?
- сНу # основной .widget
- div.head
- div.body
Создайте свой профиль:
var LogLocationBodyView = App.ItemView.extend({
tagName: "div",
attributes: {class: "body"},
template: "#log-location-body-template"
});
var LogLocationHeadView = App.ItemView.extend({
tagName: "div",
attributes: {class: "head"},
template: "#log-location-head-template"
});
А вот CollectionView:
var LogLocationsView = App.CollectionView.extend({
template: "#log-locations-template",
attributes: {id: "main", class: "widget"},
itemView: LogLocationHeadView
});
Я, очевидно, получить LogLocationHeadView, чтобы сделать, но я ищу лучший подход к inserAfter() LogLocationBodyView, так что 2 ItemViews являются братьями и сестрами.
Каков наилучший способ снять это? Я пробовал несколько разных подходов. Сначала я попытался использовать onRender() моего ItemView, но быстро понял, что могу только добавить к разметке в представлении. Мне действительно нужно вставитьAfter(), и родительский недоступен, так как внутри onRender мы все еще вставляем до DOM.
var LogLocationHeadView = App.ItemView.extend({
tagName: "div",
attributes: {class: "head"},
template: "#log-location-head-template",
onRender: function() {
// create a new piece of html from a different template
var view = new LogLocationBodyView({
model: this.model
});
view.render();
$(this.el).append(view.el);
var c = $(this.el).children();
console.log(c); // true
var p = $(this.el).parents();
console.log(p); //undefined
}
Я также понимаю, что я могу переопределить appendHTML() и renderItem() методы в CollectionViews, но мне нужно еще иметь возможность добавить(). Поэтому мне нужно было бы передать renderType.
Что мне действительно нужно сделать, так это передать массив ItemViews вместе с renderType в renderItem. Затем renderItems может развиваться в appendHTML().
var LogLocationsView = App.CollectionView.extend({
template: "#log-locations-template",
attributes: {id: "main", class: "widget"},
itemViews: [{view: LogLocationHeadView, renderType: append}, {view: LogLocationBodyView, renderType: insertAfter}]
});
Прежде чем я попытаюсь это сделать, мне нравится видеть, полностью ли я здесь. Есть лучший способ сделать это?