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

时间:2012-08-09 22:42:48

标签: javascript backbone.js marionette

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

根据文档,在应用模板之前在渲染中调用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.
        }
});

(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?
        }
});

1 个答案:

答案 0 :(得分:6)

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

serializeData必须返回有效的JSON对象,如Backbone Marionette documentation中所述:

  

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

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

});

2)IMO,答案是肯定的。在Backbone Marionette documentation中,它说:

  

CollectionView:自动渲染

     

集合视图绑定到“添加”,“删除”和“重置”事件   指定的集合。

     

当视图的集合被“重置”时,视图将调用render   自己并重新渲染整个系列。

     

将模型添加到集合时,集合视图将会   将一个模型渲染到项目视图集合中。

     

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