【发布时间】:2013-11-25 00:39:00
【问题描述】:
我一直在阅读和研究,但我无法弄清楚如何为 Backbone/Marionette 项目组织嵌套的复杂视图。 Two Collections inside a Composite View 中的答案非常接近我认为需要的答案,但在处理其中一个集合项中的多个视图时似乎还不够。
我将通过在该问题中扩展公寓示例 answer 来解释。
假设我们有一组公寓,一组房间,列出他们的椅子。此外,让我们添加公寓租户。作为租户视图的想法可以拥有自己的视图管理、事件,并可以在网站的其他地方重用。
根据我的理解,它可能看起来像:
- 公寓集合视图(集合视图)
- 公寓视图(复合视图)
- 租户视图(ItemView)
- 房间视图(复合视图)
- ChairView (ItemView)
- 公寓视图(复合视图)
我的问题是 ApartmentView 不允许多个子视图。
@scott-puleo 提供的答案副本,并添加了租户。
var apartments = [
{apartment: '1a',
rooms: [
{name: 'master bed', chairs: []},
{name: 'kitchen', chairs: [
{chairType: 'stool'}, {chairType: 'stool'}]},
{name: 'living room', chairs: [
{chairType: 'sofa'}, {chairType: 'love seat'}]}],
tenant:{name:Bob Jones,phone:6165551234}
},
{apartment: '2a',
rooms: [
{name: 'master bed', chairs: []},
{name: 'kitchen', chairs: [
{chairType: 'shaker'}, {chairType: 'shaker'}]},
{name: 'living room', chairs: [
{chairType: 'sectional'}]}]
tenant:{name:Hope Smith,phone:6365551234}
}];
var chairModel = Backbone.Model.extend({});
var roomModel = Backbone.Model.extend({
initialize: function(attributes, options) {
this.chairs = new Array();
_.each(attributes.chairs, function(chair){
this.chairs.push(new chairModel(chair));
}, this);
}
});
var ApartmentModel = Backbone.Model.extend({
initialize: function(attributes, options) {
this.rooms = new Array();
_.each(attributes.rooms, function(room){
this.rooms.push(new roomModel(room));
}, this);
}
});
var ApartmentCollection = Backbone.Collection.extend({
model: ApartmentModel
});
var ChairView = Backbone.Marionette.ItemView.extend({
template:'#chair'
});
var TenantView = Backbone.Marionette.ItemView.extend({
template:'#tenant'
});
var RoomView = Backbone.Marionette.CompositeView.extend({
template: '#room',
itemViewContainer: 'ul',
itemView: ChairView,
initialize: function(){
var chairs = this.model.get('chairs');
this.collection = new Backbone.Collection(chairs);
}
});
var ApartmentView = Backbone.Marionette.CompositeView.extend({
template: '#appartment',
itemViewContainer: 'ul',
itemView: RoomView, // Composite View
initialize: function(){
var rooms = this.model.get('rooms');
this.collection = new Backbone.Collection(rooms);
}
});
var ApartmentCollectionView = Backbone.Marionette.CollectionView.extend({
itemView: ApartmentView // Composite View
});
apartmentCollection = new ApartmentCollection(apartments);
apartmentCollectionView = new ApartmentCollectionView({
collection: apartmentCollection
});
App.apartments.show(apartmentCollectionView);
我觉得我应该考虑为每个公寓发起个人 Layouts 或 Controllers,但是效率不高,我认为这也不是它们的目的。这些也可能使管理区域中的 id 变得很棘手。
感谢您的任何指导,我会更新我可能发现的任何答案。
【问题讨论】:
标签: backbone.js marionette backbone-views