在呈现CollectionView中的所有项目之后是否会触发Marionette.js事件?

时间:2013-10-21 21:09:20

标签: javascript marionette

Backbone.Marionette.js CollectionViews和CompositeViews中,onDomRefresh事件在最初呈现DOM时触发,并且任何时候将项目添加到视图集合中(这有助于动态/“实时”)意见的性质)。在我的情况下,我想运行一个特定的jQuery函数,但是由于集合的典型长度,最好只在最后一次渲染时调用此函数以防止多余的函数调用在UI中渲染所有模型后,我只想做一次。

是否有针对此用例的适当时机的木偶事件?

3 个答案:

答案 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()中触发两次。