Marionette.CompositeView中serializeData和onRender之间的区别

Lor*_*ard 3 javascript backbone.js marionette

我正在使用Marionette.CompositeView,我想基于这两个例子(1)和(2)理解serializeData和onRender之间的区别.

根据文档,在应用模板之前在渲染中调用serializeData,并在应用模板后在渲染中调用onRender.

我的问题是:
1)为什么示例(1)有效,而(2)没有?
2)如果我重置集合,是否Marionette.CompositeView会重新渲染?

有关详细信息,请参阅代码中的注释.


(1)

return Marionette.CompositeView.extend({

        initialize: function () {
            this.collection = new MyCollection();
            this.collection.fetch();
        },

        onRender: function () {
            this.collection.length > 0 ? this.$el.show() : this.$el.hide();
           // it returns this.collection.length > 0 
           // differently from serializeData.
        }
});
Run Code Online (Sandbox Code Playgroud)

(2)

return Marionette.CompositeView.extend({

        initialize: function () {
            this.collection = new MyCollection();
            this.collection.fetch();
        },

        serializeData: function () {
            this.collection.length > 0 ? this.$el.show() : this.$el.hide(); 
           // it returns this.collection.length = 0 
           // even if this.collection.length > 0. Why?
        }
});
Run Code Online (Sandbox Code Playgroud)

xir*_*ris 6

1)正如你所说,onRender它只是一个在渲染视图后调用的回调函数.

serializeData必须返回一个有效的JSON对象,如Backbone Marionette文档中所述:

如果需要为数据自定义序列化,可以在视图上提供serializeData方法.它必须返回一个有效的JSON对象,就像您在模型或集合上调用.toJSON一样.

Backbone.Marionette.ItemView.extend({
  serializeData: function(){
    return {
      "some attribute": "some value"
    }
  }

});
Run Code Online (Sandbox Code Playgroud)

2)IMO,答案是肯定的.在Backbone Marionette文档中,它说:

CollectionView:自动渲染

集合视图绑定到指定集合的​​"添加","删除"和"重置"事件.

当视图的集合被"重置"时,视图将自己调用渲染并重新渲染整个集合.

将模型添加到集合时,集合视图会将一个模型呈现到项目视图集合中.

从集合中删除模型(或销毁/删除)时,集合视图将关闭并删除该模型的项目视图.