2016-09-07 34 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: //.. 
    } 
}); 

希望我能正確理解你的問題。

相關問題