【问题标题】:Backbone initialize: function( options ) not working in V9主干初始化:函数(选项)在 V9 中不起作用
【发布时间】:2012-04-28 04:10:40
【问题描述】:

我刚刚将我工作的网站从 Backbone.js 0.5.3 升级到 Backbone.js 0.9.2 当我这样做时,我在模型初始化方法中使用的选项参数得到了一个未定义的值。从 V.5 到 V.9 发生了什么变化

初始化:函数(选项){enter code here }

好的,这是我的模型结构。在 0.5.3 中一切正常,但是当我使用 0.9.2 选项时不再起作用。

this.myModel = Backbone.Model.extend({

        defaults: function() {
            return {
                maxDays: 7,
                index: 0

            };
        },

        initialize: function( options ) {

        }

})



this.model = new myModel();

在 0.5.3 版本中,选项将显示在默认对象中设置的所有属性。 但在 0.9.2 版中,这不再有效,它返回未定义。 由于客户敏感,我无法发布链接。

【问题讨论】:

    标签: backbone.js


    【解决方案1】:

    我相信从 0.5 到 0.9 的初始化签名保持不变。但是,只有将选项传递给构造函数才能获得传入的选项。查看annotated source for Backbone.Model。每当您实例化一个新模型实例时,构造函数都会这样做:

    this.initialize.apply(this, arguments);
    

    所以你传递给构造函数的任何东西都会未经修改地传递给初始化。因此,请在您的代码中查看您正在实例化新模型实例但未传递 2 个参数(属性和选项)的情况。

    根据您的代码示例,您现在需要将 initialize 定义为采用 2 个参数:attributesoptions,并且在创建模型时,如果您只想传递选项,请执行以下操作:

    var model = new Model(null, options);
    

    var model = new Model({}, options);
    

    我认为破坏代码的具体更改是从 0.5.3 中使用显式参数调用初始化到在 0.9.3 中使用 apply 和参数,如下所示:

        this.initialize.apply(this, arguments);
    

    所以在 0.9 中,您可以通过 this.attributes 访问您的默认值,但它们不会作为函数参数出现,除非它们作为构造函数的参数出现。

    var MyModel = Backbone.Model.extend({
        defaults: {x: 42, y: 43},
        initialize: function(attributes, options) {
            console.log(arguments, attributes, this.attributes);}
    });
    var m = new MyModel();
    

    这将记录[], undefined, Object,因为参数为空,属性未定义,因为没有任何内容传递给构造函数,但默认值已在this.attributes 中设置,可供您使用。

    【讨论】:

    • 我在上面添加了更多代码。所以初始化应该有2个参数。选项是第二个。但是,如果您说自 V5 以来没有改变,那么这并不能解释为什么它在 V5 中只使用一个参数而不在 V9 中起作用
    • 我检查了 0.5.3 源代码:github.com/documentcloud/backbone/blob/… 和 0.9.2 源代码:github.com/documentcloud/backbone/blob/…,它们都采用属性和选项。现在查看您的代码...
    • 好的,谢谢,所以我在代码中添加了第二个参数,但它仍然为 V9 中的两个参数返回 undefined。初始化:函数(属性,选项){这是您指的吗?然后在 V5 中,只有第一个参数在我的设置中有效。
    • 我们在谈论争论。您需要发布通过它们的代码的 sn-p、您创建模型的位置以及模型代码,以便我能够智能地帮助您。到目前为止,您只发布了 1/2 的相关代码。
    • 好的,你上面的例子就是我如何称呼我的模型。 on;y 的区别是我什么都不通过。变种模型 = 新模型();在 V5 中,选项返回默认对象中的所有属性。在 V9 中,它返回 undefined。
    猜你喜欢
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多