2012-06-18 65 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