2012-02-25 3 views
2

私はbackbone.jsコレクションにいくつかの特別なプロパティを持っています。私が試してみて、説明するために簡単な例を思い付いた:有効期限を過ぎてもコレクション状態が残っているようです

TestCollection = Backbone.Collection.extend({ 
    properties: { 
     something: 'foo', 
     other: 'bar' 
    } 
}); 

testがURL #testがヒットしたときに呼び出されるルートであると言います。このメソッドを実行します。

test: function(){ 
    var c = new TestCollection(); 
    console.log(c.properties.something); 
    c.properties.something = 'changed'; 
}, 

私はその後、別のハッシュを訪問し、#anythingelseを言うし、その後#testに戻った場合は、コンソールには、まだかなり"foo"の値よりも、"changed"をログに記録します。コレクションが作成されるときに状態を「リセット」する必要があります。なぜ私はローカル変数を持っているときに状態を維持していますか?私は_.cloneのようないくつかのプロパティを試して、いくつかのプロパティを "バックアップ"し、それらを初期化関数で取得させるようにしましたが、まだ成功していません。私は何かを誤解しているだけで、簡単な解決策があると思っています。

答えて

2

深いコピーが行われないため、すべてのTestCollectionインスタンスが完全に同じproperties値を共有してしまいます。実際には、​​以下のように、インスタンスではなくプロトタイプにpropertiesが添付されているため、コピーが全く行われません。たとえば、これはあなたのコンソールで3 pancakesを与える3つのすべてのインスタンスがそのpropertiesでまったく同じ{something: '...'}オブジェクト共有しているため:

TestCollection = Backbone.Collection.extend({ 
    properties: { 
     something: 'foo' 
    }, 
    m: function(x) { 
     this.properties.something = x; 
    } 
}); 
var t1 = new TestCollection(); 
var t2 = new TestCollection(); 

t1.m('pancakes'); 
console.log(t1.properties.something); 
console.log(t2.properties.something); 

var t3 = new TestCollection(); 
console.log(t3.properties.something); 

をデモ:http://jsfiddle.net/ambiguous/hBeHU/

このジレンマのうち簡単な方法は、移動することですコレクションのinitializeにあなたのproperties

TestCollection = Backbone.Collection.extend({ 
    initialize: function() { 
     this.properties = { 
      something: 'foo' 
     }; 
    }, 
    m: function(x) { 
     this.properties.something = x; 
    } 
}); 

あなたはTestCollectionのこのバージョンを使用する場合、あなたは1 01を取得しますコンソールにはと2つのfooがあります。

デモ:http://jsfiddle.net/ambiguous/GywKF/

+1

ただ、すべての 'TestCollection'インスタンスは、共通の' properties'属性は深いコピーに関連していない持っているかどうかということを指摘します。あなたの最初の例では、 'extend'に' properties'を定義すると 'TestCollection.prototype'に追加され、TestCollectionのすべてのインスタンスで利用できる単一の参照を作成しますが、2つ目の例ではTestCollectionインスタンスごとに参照を作成します。 – ggozad

+0

@ ggozad:そうです、OPは 'properties'がコピーされていないときに各インスタンスに深くコピーされることを期待しています。私はそれを明確にしようとしました。 –

関連する問題