10

我只是将我工作的站点从 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 版中,这不再有效,它返回未定义。由于客户敏感,我无法发布链接。

4

1 回答 1

15

我相信从 0.5 到 0.9 的初始化签名保持不变。但是,只有将选项传递给构造函数才能获得传入的选项。查看Backbone.Model 的注释源。每当您实例化一个新模型实例时,构造函数都会执行以下操作:

this.initialize.apply(this, arguments);

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

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

var model = new Model(null, options);

或者

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

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

    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并且可以使用。

于 2012-04-27T18:57:41.313 回答