我在Backbone.js的应用程序的开头有一个简单的设置
代码位于this gist
这很简单。 Coin
模型和集合,Player
模型和集合。每个玩家都有一系列硬币。我手动添加玩家应该获得的硬币类型。
在initialize
结束时,每个玩家Coins
集合中有32个项目,Coins.player_id
在所有4个玩家中都设置为4。
我错过了什么?
答案 0 :(得分:3)
我猜您的问题是defaults
中的Player
:
var Player = Backbone.Model.extend({
defaults: {
id: 0,
name: '',
coins: new Coins()
},
//...
});
defaults
将被浅层复制到新的Player
,因此它们最终会分享完全相同的coins: new Coins()
。只要defaults
包含任何可变数据(即数组,对象文字......),就会发生类似的事情。所有这些:
this.Taylor.get("coins")
this.Sugar.get("coins")
this.Darlene.get("coins")
this.Cody.get("coins")
将最终成为完全相同的对象。 fine manual可以这样说:
默认
model.defaults or model.defaults()
默认值哈希(或函数)可用于指定模型的默认属性。创建模型实例时,任何未指定的属性都将设置为其默认值 [...]
请记住,在JavaScript中,对象是通过引用传递的,因此如果您将对象包含为默认值,它将在所有实例之间共享。
请注意最后的一点警告。如果您使用defaults
的函数:
var Player = Backbone.Model.extend({
defaults: function() {
return {
id: 0,
name: '',
coins: new Coins()
};
},
//...
});
然后您应该为每个'coins'
获得不同的Player
。或者,您可以在'coins'
:
initialize
var Player = Backbone.Model.extend({
//...
initialize: function() {
this.set('coins', new Coins);
// Or only set it if it isn't there if that makes sense...
},
//...
});