0

问题

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

当第二个(以及所有后续的)孩子被初始化时,孩子的属性显示默认的孩子和它的父母。

小提琴

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"

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

var child2 = new Child();

child2 属性:

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

问题

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

因为我必须Backbone.Collection在 a中显示一个,<ul>并且每个模型的属性都可以通过每个<li>. 但由于这个问题,我无法获得集合中第一个模型的所有属性。

4

1 回答 1

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);

工作示例

于 2013-07-09T17:35:45.790 回答