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

defaultsで値にアクセスできますApp.Models.Site.prototype.defaults

を使用する場合get(以下を参照)testArray、モデルインスタンスの現在の値を取得します。これは、インスタンス間で常に同じになるとは限りません。


.attributesモデルのプロパティは、モデル自体ではなく、モデルのプロパティ内に保存されます。モデルプロパティの値を取得する唯一の方法は、を使用することget(propertyName)です。

このように行われる理由setは、オブジェクトの値を変更するだけでなく、イベントをトリガーしてUIを新しい値などで更新するためです。this.testArray代わりに実行できる場合は、 -this.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 に答える