Backbone初始化:函数(选项)在V9中不起作用

use*_*509 9 backbone.js

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

initialize:function(options){ 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();
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*ons 15

初始化的签名保持不变,我认为从0.5到0.9.但是,如果将它们传递给构造函数,则只能获取传入的选项.查看Backbone.Model的带注释的源代码.每当您实例化一个新的模型实例时,构造函数都会这样做:

this.initialize.apply(this, arguments);
Run Code Online (Sandbox Code Playgroud)

所以无论你传递给构造函数的是什么都未经修改地传递给初始化.因此,请查看代码,了解实例化新模型实例但不传递2个参数(属性和选项)的情况.

基于您的代码示例,您现在需要定义initialize为服用2个参数:attributesoptions和创建你的模型,如果你只想通过选择时做到:

var model = new Model(null, options);
Run Code Online (Sandbox Code Playgroud)

要么

var model = new Model({}, options);
Run Code Online (Sandbox Code Playgroud)

我认为破坏你的代码的具体变化是从使用0.5.3中的显式参数调用initialize到使用0.9.3中的apply和arguments这样的转换:

    this.initialize.apply(this, arguments);
Run Code Online (Sandbox Code Playgroud)

因此,在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();
Run Code Online (Sandbox Code Playgroud)

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