如何在第一次初始化时显示模型子类的所有属性?

时间:2013-07-09 17:29:29

标签: backbone.js

问题

初始化第一次的子模型时,只将子项的默认值设置为属性。

当初始化第二个(以及所有后续)子项时,子项的属性显示了child及其父项的默认值。

Fiddle

var Parent = Backbone.Model.extend({
    defaults: {
        name: "john",
        lname: "smith",
        age: 30,
        language: "english",
        location: "belgium"
    }
});

var Child = Parent.extend({
    defaults: {
        hobby: "doing nothing",
            age: 24,
        occupation: "student"
    },
    initialize: function () {
        this.constructor.__super__.initialize.apply(this, arguments);
        _.defaults(this.defaults, this.constructor.__super__.defaults);
        console.log(this.attributes);            
    }
});

第一次初始化的子属性:

 var child1 = new Child();

child1.attributes:

 hobby: "doing nothing"
 age: 24
 occupation: "student"

同一Child类的属性,第二次初始化:

var child2 = new Child();

child2属性:

age: 24
hobby: "doing nothing"
language: "english"
lname: "smith"
location: "belgium"
name: "john"
occupation: "student"

问题

为什么第一次初始化子模型时,所有默认值(子项和父项)是否被设置为属性?

因为我要在Backbone.Collection内显示<ul>,并且每个模型的属性都可以通过每个<li>内的html表单进行配置。但由于这个问题,我无法获得集合中第一个模型的所有属性。

1 个答案:

答案 0 :(得分:1)

在第一个对象实例化时,在defaults方法期间,您正在修改Child类的initialize对象。此时,Backbone.Model构造函数已经使用defaults来填充该对象的属性,因此它只会影响后续的实例化。

看看Backbone.Model:

  var Model = Backbone.Model = function(attributes, options) {
    var defaults;
    var attrs = attributes || {};
    options || (options = {});
    this.cid = _.uniqueId('c');
    this.attributes = {};
    _.extend(this, _.pick(options, modelOptions));
    if (options.parse) attrs = this.parse(attrs, options) || {};
    if (defaults = _.result(this, 'defaults')) {
      attrs = _.defaults({}, attrs, defaults);
    }
    this.set(attrs, options);
    this.changed = {};
    this.initialize.apply(this, arguments);
  };
在设置默认值之后,

initialize是最后一步,因此在此时修改defaults将不会对当前对象执行任何操作。

要让它按照您的需要运行,请在声明课程后修改defaults,而不是在initialize期间修改:

Child.prototype.defaults = _.defaults(Child.prototype.defaults, Parent.prototype.defaults);

Working example