在Backbone.Marionette.js CollectionViews 和 CompositeViews 中,该onDomRefresh
事件在 DOM 初始渲染时触发,并且在任何时候将项目添加到视图的集合中(这有助于视图的动态/“实时”性质)。就我而言,我想运行某个 jQuery 函数,但由于集合的典型长度,最好在最后一次渲染时只调用一次这个函数,以防止对我只想做一次的事情进行过多的函数调用在 UI 中呈现所有模型之后。
是否有适合此用例的木偶事件?
在Backbone.Marionette.js CollectionViews 和 CompositeViews 中,该onDomRefresh
事件在 DOM 初始渲染时触发,并且在任何时候将项目添加到视图的集合中(这有助于视图的动态/“实时”性质)。就我而言,我想运行某个 jQuery 函数,但由于集合的典型长度,最好在最后一次渲染时只调用一次这个函数,以防止对我只想做一次的事情进行过多的函数调用在 UI 中呈现所有模型之后。
是否有适合此用例的木偶事件?
我整个下午都在尝试使用 Erik 的解决方案,但从未触发过“collection:rendered”事件。拖网后,我看到它不再存在了:(
但是有一种相当简单的方法可以获得所需的行为。
在 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");
}
}
它之所以有效,是因为集合计数会立即上升到其新长度,而子长度一次更新一个。
很简单,它让我很开心 :) 希望它也能帮助别人。
你可以听“collection:rendered”。这是 CollectionView 在完成渲染子项时触发的内容:
this.triggerMethod("collection:rendered", this);
你可以使用这个:
this.listenTo(myCollectionView, "collection:rendered", _awesomeCallback);
当然,您将需要更改上述内容。
编辑:
这是集合视图的渲染方法:
render: function(){
this.isClosed = false;
this.triggerBeforeRender();
this._renderChildren();
this.triggerRendered();
return this;
}
this.triggerRendered() 触发 this.triggerMethod("collection:rendered", this),因此集合将在触发 "collection:rendered" 之前呈现。
从 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()
。