6

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

是否有适合此用例的木偶事件?

4

3 回答 3

7

我整个下午都在尝试使用 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");
  }
}

它之所以有效,是因为集合计数会立即上升到其新长度,而子长度一次更新一个。

很简单,它让我很开心 :) 希望它也能帮助别人。

于 2014-08-04T17:12:45.903 回答
3

你可以听“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" 之前呈现。

于 2013-10-21T23:39:43.610 回答
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()

于 2015-05-18T22:39:37.493 回答