有人可以在Backbone中向我解释范围吗?以下示例中的最佳方法是使用get方法检索默认变量的值吗?
如果我不使用get方法,我的数组将显示为未定义。
App.Models.Site = Backbone.Model.extend({
defaults: {
testArray: [1, 2, 3]
},
initialize: function(){
console.log('initialize', this.testArray); // logs undefined
console.log('initialize', this.get('testArray')); // logs [1, 2, 3]
this.test();
},
test: function(){
console.log('initialize', this.testArray); // logs undefined
console.log('test', this.get('testArray')); // logs [1, 2, 3]
}
});
答案 0 :(得分:1)
您可以使用defaults
访问App.Models.Site.prototype.defaults
值。
如果您使用get
(见下文),您将检索模型实例的当前testArray
值。在实例中,这并不总是相同的。
模型属性存储在模型的.attributes
属性中,而不是模型本身。检索模型属性值的唯一方法是使用get(propertyName)
。
以这种方式完成的原因是因为set
不仅会更改对象的值,还会触发事件以使用新值等更新UI。如果您可以执行this.testArray
this.get('testArray')
this.testArray
你可以为.attributes
分配值是合理的 - 但这会破坏事情。
出于这个原因,你也不应该使用{{1}}来分配值 - 不会触发事件处理程序。
答案 1 :(得分:1)
有几件事。
首先,在defaults
中,您要定义模型字段,而不是模型实例的(对象)字段。模型字段是序列化到数据存储的内容。您的对象字段只是您的对象的一部分,无论您需要它们的目的是什么。
其次,我认为使用方法构建默认值可能会更好地编写默认值:
....
defaults: function(){
return {
testArray: [1, 2, 3]
};
},
...
因此,每个模型都以[1, 2, 3]
的副本开头,而不是每个模型共享对[1, 2, 3]
的唯一数组的引用(如果您的任何模型更改了该数组,请说明如果您这样做this.get('testArray')[0]=4
,突然默认值看起来会非常不同)。当然,只有set
字段为新的数组值,才会发生这种情况。