2013-10-21 32 views
5

Backbone.Marionette.js CollectionView和CompositeViews,onDomRefresh事件會在最初呈現DOM時觸發,並隨時將某個項目添加到視圖的集合中(這有助於視圖的動態/「實況」性質)。在我的情況下,我想運行某個jQuery函數,但由於集合的典型長度,最好只在最後呈現時調用此函數一次,以防止對我只想要的某些東西畢竟在UI中渲染模型。是否有一個Marionette.js事件在呈現CollectionView中的所有項目後觸發?

在此用例的適當時機是否存在Marionette事件?

+0

http://stackoverflow.com/questions/13529407/backbone-marionette-collectionview-callback-when-all-itemviews-have-finished-ren? 編輯:哦,對不起,沒有看到你要求CollectionView。 –

+0

沒問題,一個'CompositeView'方法也可以工作,但**不是'itemView'。 – Brian

回答

2

從V2.4.1 http://marionettejs.com/annotated-src/backbone.marionette.html開始,現在是render:collection,您應該在CollectionView完成渲染子節點後收聽。

_renderChildren: function() { 
    this.destroyEmptyView(); 
    this.destroyChildren(); 

    if (this.isEmpty(this.collection)) { 
    this.showEmptyView(); 
    } else { 
    this.triggerMethod('before:render:collection', this); 
    this.startBuffering(); 
    this.showCollection(); 
    this.endBuffering(); 
    this.triggerMethod('render:collection', this); 

    if (this.children.isEmpty()) { 
     this.showEmptyView(); 
    } 
    } 
}, 

我會建議不要使用mexitalian的答案,檢查是否the children.length == the collection.length將在方法onAddChild()開火兩次。

+0

我會認爲這是最新和最偉大的,請有人告訴我,如果這是錯誤的,因爲我現在不使用木偶。 – Brian

3

你可以聽「collection:rendered」。這裏是的CollectionView觸發什麼,當它完成渲染的孩子:

this.triggerMethod("collection:rendered", this); 

您可以使用此:

this.listenTo(myCollectionView, "collection:rendered", _awesomeCallback); 

當然,你將需要改變以上。

EDIT

下面是一個集合視圖render方法:

render: function(){ 
    this.isClosed = false; 
    this.triggerBeforeRender(); 
    this._renderChildren(); 
    this.triggerRendered(); 
    return this; 
    } 

this.triggerRendered()觸發關閉this.triggerMethod( 「集合:呈現」,這一點),所以該集合將在觸發「collection:rendered」之前呈現。

+3

這不是準確的...集合:渲染是在任何項目呈現之前觸發的。據我可以告訴唯一的方法來知道什麼時候所有項目呈現是聽itemview:item:呈現,保持一個計數,並將其與collection.length – urbananimal

+0

添加render()方法代碼,它顯示「集合:呈現「直到孩子被渲染後才被解僱。 –

6

我一直試圖在下午使用Erik的解決方案,但「集合:渲染」事件從未被解僱。 。拖網雖然我看到它已經不存在了:(

但是有一個相當簡單的方法,從而獲得所需的行爲源後

從內的CollectionView使用onAddChild回調做到以下幾點:

onAddChild : function() { 
// Check all the models in the collection have their child views rendered 
    if (this.children.length == this.collection.length) { 
    // Now you could do something like 
    this.trigger("collection:rendered"); 
    } 
} 

它的工作原理,因爲收集數上升到了新的長度瞬間,而孩子們長度更新一次一個。

很簡單,它使我快樂:) 希望它可以幫助索姆也是其他人。

+0

謝謝,它讓我開心:) –

相關問題