构建视图,在区域中添加新的子视图
问题描述:
我使用Marionette 3.0。构建视图,在区域中添加新的子视图
我有BlockView可能有不同数量的区域。 这些区域充满了BlockRegionViews,它们是CollectionViews(它们将在2.x中),并且这些视图呈现更多的BlockViews。 我想写一个函数,它创建一个BlockView,它的区域已经填充了(空的)BlockRegionViews,并且返回这个BlockView。
所以我写了这个代码:
var blockView = new BlockView({model: blockModel});
var regions = blockModel.get('regions')
for(var i in regions) {
var blockRegionModel = regions[i];
var blockRegionView = new BlockRegionView({model: blockRegionModel});
blockView.addRegion(blockRegionModel.get('position'), '...regiondefinition...');
var region = blockView.getRegion(blockRegionModel.get('position'));
// This is the line where i get the error.
region.show(blockRegionView);
}
return blockView;
当然我的代码是坏的。即使show函数的名字也表明它不适合我(因为我不想在这个时候显示任何视图),但在文档中我找不到这样的东西。
所以我的问题是:我应该如何构建一个视图与在其区域中初始化的其他视图,而不呈现任何视图?
答
如果我正确地理解了你,你希望在视图中渲染视图,并且在所有视图都被初始化之前不渲染任何东西。
您的描述中的块模型和区域处理有点混乱,所以我希望您可以将其应用于您的案例。
关于a View's lifecycle的文档很有帮助。
var ChildView = Mn.View.extend({..});
var ParentView = Mn.View.extend({
template: //..,
onBeforeRender: function() {
this.showChildView('reg1', new ChildView({model: someModel}));
},
regions: {
reg1: //..
}
});
在上面的例子中ChildView
将被实例化并连接到所述ParentView
ParentView
之前已经呈现。但是,当渲染ParentView
时,ChildViews
将被实例化并呈现在其区域中。
你提到你不想渲染任何东西。这是一种罕见的情况,但您可以在任何渲染事件之外实例化子视图。
var ChildView = Mn.View.extend({..});
var ParentView = Mn.View.extend({
template: //..,
initialize: function() {
this.childView = new ChildView({model: someModel});
},
// You can decide whenever you want to show the childView
// and invoke this method.
showTheChildView: function() {
this.getRegion('reg1').show(this.childView);
},
regions: {
reg1: //..
}
});
希望我能正确理解你的问题。
CollectionViews仍然是Marionette 3.x版本的一部分,然而LayoutView和ItemView现在只是称为View(它们非常相似)。 – miphe