采用以下模型:
MyModel= Backbone.Model.extend({
defaults : {
myNestedModel:undefined,
},
initialize: function() {
this.set({myNestedModel: new MyNestedModel());
}
});
它有一个名为'myNestedModel'的属性,它具有以下定义:
MyNestedModel= Backbone.Model.extend({
defaults : {
myModel:undefined,
}
});
它也有一个属性名称'myModel'。现在,如果我创建一个MyModel实例:
aModel = new MyModel();
嵌套模型将在MyModel的initialize方法中设置。然后我在两个步骤中使用JSON.stringify:
// Use Backbone.js framework to get an object that we can use JSON.stringfy on
var modelAsJson = aModel.toJSON();
// Now actually do stringify
var modelAsJsonString = JSON.stringify(modelAsJson);
这很好用,我得到了MyModel的JSON表示,它的属性是MyNestedModel。使用默认值时会出现问题,例如:
MyModel= Backbone.Model.extend({
defaults : {
new MyNestedModel(),
}
});
这会导致JSON.stringify出现问题,因为它不支持循环引用。我假设正在创建循环引用,因为MyModel的所有实例共享MyNestedModel的相同实例。而initialize方法为每个实例创建一个新的嵌套模型。
defaults:{}
的理解是“原因”
问题对不对? defaults:{}
的使用
关于价值何时适用,何时被覆盖和
实例是否共享相同的默认“实例”?答案 0 :(得分:7)
默认值仅用于模型内的属性(模型中的数据),无论何时创建模型,它都会从默认值中获取值并设置属性。 e.g。
User = Backbone.Model.extend({
defaults : {
rating : 0
}
})
User1 = new User({ name : 'jack', email : 'jack@gmail.com' });
User2 = new User({ name : 'john', email : 'john@gmail.com' });
User1.set({ rating : 2 });
现在,使用toJSON调用时,您的两个模型将打印
{
rating: 2,
name: 'jack',
email: 'jack@gmail.com'
}
{
rating: 0,
name: 'john',
email: 'john@gmail.com'
}
由于默认值是一个对象,因此您放置的每个值都会立即进行评估:
defaults : {
rating : defaultRating()
}
将调用defaultRating() - 不是每次初始化模型时,而是立即(在extend方法中)
对于模型创建时需要一些数据的模型,您应该使用默认值(例如new myModel())
在您的示例中,您有以下错误:
1.设置没有属性的值
defaults : {
PROPERTY : new Model()
}
2.您的默认设置不需要这样的选项 - 您应该只为该模型放置属性(数据)
默认值始终适用,只要它不会被扩展模型中的新默认值替换,例如
var Model = Backbone.Model.extend({ defaults : { alpha : 'beta' } });
var myModel = Model.extend({ defaults : { beta : 'gama' } });
现在你的myModel在初始化时会有
{ beta : 'gama' } // alpha : 'beta' will not be set as value, because it is replaced