Укажите элемент HTML <tbody> в качестве области в Marionette для Backbone.js
Проблема
Используя Backbone.Marrionette.Layout, чтобы представить некоторые табличные данные. Часть <tbody>
таблицы представляет собой Backbone.Marionette.Region, который предназначен для отображения Backbone.Marionette.CollectionView.
Я не могу понять, как это сделать, используя Marionette "Регионы", не испортив отображение таблицы, вставив дополнительный элемент HTML внутри элемента <tbody>
.
Пример кода
Layout
выглядит следующим образом:
Backbone.Marionette.Layout.extend({
template:...
regions:{
list_region: '#list-region'
}
onRender:function(){
var collection = new TheCollection()
var collectionView = new TheCollectionView({
collection: collection
})
// PROBLEM: The region seems to needs its own HTML element,
// and the CollectionView also seems to need its on HTML
// element, but as far as I can see, there is only room
// for one element: <tbody>?
this.list_region.show(collectionView);
});
Шаблон для макета содержит всю таблицу:
<table>
<tbody id='list-region'>
</tbody>
<tfoot id='footer-region'>
Some other stuff goes here that is not a collection, so I was able
to make the View 'tagName' property 'tr', which worked fine.
</tfoot>
</table>
Любые предложения?
Ответы
Ответ 1
Является ли цель этого макета исключительно для облегчения работы таблицы? Если это так, вы должны посмотреть на использование CompositeView.
RowView = Marionette.ItemView.extend({
tagName: "tr",
template: ...
});
TableView = Marionette.CompositeView.extend({
template: ...,
childView: RowView,
childViewContainer: "#list-region"
});
Это в значительной степени. Это приведет к тому, что все ваши элементы будут отображаться в теле.
Ответ 2
Marionette 3 не одобряет класс CompositeView
. Вместо этого область теперь может перезаписывать свой el
с отображаемым содержимым
внутренний вид с новый replaceElement
вариант.
Смотрите этот пример, чтобы отобразить таблицу:
var RowView = Marionette.View.extend({
tagName: 'tr',
template: '#row-template'
});
var TableBody = Marionette.CollectionView.extend({
tagName: 'tbody',
childView: RowView
});
var TableView = Marionette.View.extend({
tagName: 'table',
className: 'table table-hover',
template: '#table',
regions: {
body: {
el: 'tbody',
replaceElement: true
}
},
onRender: function() {
this.showChildView('body', new TableBody({
collection: this.collection
}));
}
});
var list = new Backbone.Collection([
{id: 1, text: 'My text'},
{id: 2, text: 'Another Item'}
]);
var myTable = new TableView({
collection: list
});
myTable.render();