Backbone Scope访问变量的最佳实践

时间:2013-02-18 11:48:11

标签: javascript backbone.js

有人可以在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]
    }
});

2 个答案:

答案 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字段为新的数组值,才会发生这种情况。