【问题标题】:Difference between serializeData and onRender in Marionette.CompositeViewMarionette.CompositeView 中 serializeData 和 onRender 的区别
【发布时间】:2012-08-09 22:42:47
【问题描述】:

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

根据文档serializeData在应用模板之前在render中调用,onRender在应用模板之后在render中调用。

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

请查看代码中的 cmets 了解更多详情。


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

【问题讨论】:

    标签: javascript backbone.js marionette


    【解决方案1】:

    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:自动渲染

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

    当视图的集合被“重置”时,视图将调用渲染 在自身上并重新渲染整个集合。

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

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

    【讨论】:

    • +1 感谢您的回复。无论如何,关于(1),我无法从您的回复中理解为什么 this.collection.length = 0 在 serializeData 而在 onRenderthis.collection.length > 0
    • 我想是因为 serializeData 方法必须只用于准备要显示的数据。这就是为什么还有另一个回调方法“beforeRender”。
    • 我唯一要补充的是,这两种方法提供完全不同的功能,并且在非常不同的时间被调用。不要将一个用于另一个的工作。查看方法名称以了解它们的作用。 serializeData 序列化用于呈现模板的数据。 onRender 在视图渲染后立即被调用。
    • 如果这不能解决问题,请将一些 debugger; 调用添加到您的一个视图的 serializeDataonRender,并在您的浏览器中打开您的开发工具运行它。你会很快看到每个被调用的时间。还要看源代码。它有据可查且格式正确。通过自己阅读代码,您会学到很多东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 2012-07-04
    • 1970-01-01
    • 2011-10-12
    • 2011-02-17
    • 2016-10-18
    相关资源
    最近更新 更多