在Backbone.Marionette.js CollectionViews和CompositeViews中,onDomRefresh
事件在最初呈现DOM时触发,并且任何时候将项目添加到视图集合中(这有助于动态/“实时”)意见的性质)。在我的情况下,我想运行一个特定的jQuery函数,但是由于集合的典型长度,最好只在最后一次渲染时调用此函数以防止多余的函数调用在UI中渲染所有模型后,我只想做一次。
是否有针对此用例的适当时机的木偶事件?
答案 0 :(得分:7)
我整个下午一直试图使用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");
}
}
它的作用是因为收集计数会立即上升到新的长度,而子项长度会一次更新一次。
很简单,它让我开心:) 希望它也可以帮助其他人。
答案 1 :(得分:3)
您可以收听“collection:rendered”。以下是CollectionView在渲染子项时触发的内容:
this.triggerMethod("collection:rendered", this);
您可以使用:
this.listenTo(myCollectionView, "collection:rendered", _awesomeCallback);
当然,您需要更改上述内容。
修改强>:
以下是集合视图的render方法:
render: function(){
this.isClosed = false;
this.triggerBeforeRender();
this._renderChildren();
this.triggerRendered();
return this;
}
this.triggerRendered()触发this.triggerMethod(“collection:rendered”,this),因此集合将在“collection:rendered”被触发之前呈现。
答案 2 :(得分: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()
中触发两次。