2013-02-18 40 views
2

某人可以在Backbone中向我解释范围吗?在下面的例子中,使用get方法检索默认变量的值是最好的方法吗?Backbone Scope访问变量的最佳做法

如果我不使用get方法,我的数组就会以undefined的形式出现。

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

您是否希望为模型实例获取'testArray'的默认值或'testArray'的实际值?我的文章是否回答你的问题?尽管我最初误解了你正在寻找的东西并编辑了我的答案,但现在我认为它可能是正确的。 – 2013-02-18 12:02:24

回答

1

您可以App.Models.Site.prototype.defaults访问defaults值。

如果您使用get(见下文),您将检索您的模型实例的当前testArray值。这在实例中并不总是相同的。


模型属性存储在模型的.attributes属性中,而不是模型本身。检索模型属性值的唯一方法是使用get(propertyName)

,它的完成这样的原因是因为set不只是改变对象的价值,但也触发事件来更新与新价值等UI如果你能做到的,而不是this.testArraythis.get('testArray')将是合理的您也可以将值分配给this.testArray - 但这会破坏事情。

因此,您也不应该使用.attributes来分配值 - 不会触发事件处理程序。

1

几件事。

首先,在defaults中,您正在定义模型字段,而不是模型实例的(对象)字段。模型字段是序列化到数据存储的内容。您的对象字段只是您的对象的一部分,可以满足您所需的任何目的。

其次,我认为你的违约可能使用一种方法来构造默认值更好的写法:使每一个模型的[1, 2, 3],而不是每个模型共享至一个参考的副本开始

.... 
defaults: function(){ 
     return { 
     testArray: [1, 2, 3] 
     }; 
     }, 
... 

只有数组是[1, 2, 3](如果您的任何模型更改了该数组,则说明如果您执行this.get('testArray')[0]=4,突然默认值将看起来非常不同)。如果你只有set这个字段到一个新的数组值,这当然不会发生。