我在 Backbone.js 中为应用程序的开始做了一个简单的设置
。代码在这个 gist中。
这很简单。一个Coin
模型和集合,一个Player
模型和集合。每个玩家都有一组硬币。我手动添加玩家应该获得的硬币类型。
在 结束时initialize
,每个 PlayersCoins
集合中有 32 个项目,并且Coins.player_id
在所有 4 个 Players 中设置为 4。
我错过了什么?
我在 Backbone.js 中为应用程序的开始做了一个简单的设置
。代码在这个 gist中。
这很简单。一个Coin
模型和集合,一个Player
模型和集合。每个玩家都有一组硬币。我手动添加玩家应该获得的硬币类型。
在 结束时initialize
,每个 PlayersCoins
集合中有 32 个项目,并且Coins.player_id
在所有 4 个 Players 中设置为 4。
我错过了什么?
我猜你的问题是你defaults
的Player
:
var Player = Backbone.Model.extend({
defaults: {
id: 0,
name: '',
coins: new Coins()
},
//...
});
这defaults
将被浅复制到 new Player
s,因此它们最终都会共享完全相同的 s coins: new Coins()
。defaults
只要包含任何可变数据(即数组、对象字面量……),就会发生类似的事情。所以所有这些:
this.Taylor.get("coins")
this.Sugar.get("coins")
this.Darlene.get("coins")
this.Cody.get("coins")
最终将成为完全相同的对象。精美的手册是这样说的:
默认值
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...
},
//...
});