2012-06-18 86 views
0

我有一個模型的兩個實例,並發現它們似乎在它們之間共享狀態。我會認爲會發生相反的情況。例如:默認情況下,骨幹模型共享狀態

var Q =  Backbone.Model.extend({ 
    defaults: { 
    fooObj: { 
     bar: {} 
    } 
    }, 
    initialize: function() { 
    _.bindAll(this, 'addFoo'); 
    }, 
    addFoo: function(f) { 
     //get fooObj 
     fo = this.get('fooObj'); 
     fo.bar[1] = f; 
     //set it back 
     this.set('fooObj', fo); 
     }, 
    getFoo: function (argument) { 
     return this.get('fooObj'); 

    } 
}) 

q1 = new Q(); 
q2 = new Q(); 

q1.addFoo({iam: 'foo'}); 
console.log(q2.getFoo().bar[1]); // {iam : "foo"} 

雖然我添加{iam: "foo"}到實例q1,似乎得到傳播到q2了。我在這裏錯過了一招嗎?看來getset是訪問模型數據的正確安全方式,但它會導致這種行爲(或者這是預期的)?

回答

4

是的fooObj將被共享,因爲您正在模型定義時創建一個。

而是用一個函數(見docs)創建您的默認值:

defaults: function() { 
    return { 
    fooObj: { 
     bar: {} 
    } 
    }; 
} 
+0

的文檔甚至說:*請記住,在JavaScript中,對象是按引用傳遞的,所以如果你有一個對象作爲默認值,它將在所有實例中共享。* –

+0

謝謝,對不起,我錯過了! – malangi