2016-09-07 100 views
0

我使用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函数的名字也表明它不适合我(因为我不想在这个时候显示任何视图),但在文档中我找不到这样的东西。

所以我的问题是:我应该如何构建一个视图与在其区域中初始化的其他视图,而不呈现任何视图?

+0

CollectionViews仍然是Marionette 3.x版本的一部分,然而LayoutView和ItemView现在只是称为View(它们非常相似)。 – miphe

回答

0

如果我正确地理解了你,你希望在视图中渲染视图,并且在所有视图都被初始化之前不渲染任何东西。

您的描述中的块模型和区域处理有点混乱,所以我希望您可以将其应用于您的案例。

关于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将被实例化并连接到所述ParentViewParentView之前已经呈现。但是,当渲染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: //.. 
    } 
}); 

希望我能正确理解你的问题。

相关问题