2

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

2 回答 2

1

您可以使用 访问该defaultsApp.Models.Site.prototype.defaults

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


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

这样做的原因是因为set不仅会更改对象的值,还会触发事件以使用新值更新 UI 等。如果您可以这样做this.testArraythis.get('testArray')那么您也可以将值分配给this.testArray-但这会破坏事情。

出于这个原因,您也不应该使用.attributes来分配值 - 不会触发任何事件处理程序。

于 2013-02-18T11:49:55.867 回答
1

几件事。

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

其次,我认为使用构造默认值的方法可能会更好地编写默认值:

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

这样每个模型都以一个副本开头,[1, 2, 3]而不是每个模型共享对一个且唯一的数组的引用[1, 2, 3](如果您的任何模型更改了该数组,比如说如果您这样做this.get('testArray')[0]=4了,默认值会突然看起来非常不同)。set当然,如果您只将字段设置为新的数组值,那将永远不会发生。

于 2013-02-18T12:15:44.317 回答