问题
初始化第一次的子模型时,只将子项的默认值设置为属性。
当初始化第二个(以及所有后续)子项时,子项的属性显示了child及其父项的默认值。
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表单进行配置。但由于这个问题,我无法获得集合中第一个模型的所有属性。
答案 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);