问题描述
我有一个简单的设置,用于在 Backbone.js 中启动一个应用程序
代码在本要点中.
这很简单.一个 Coin
模型和集合,一个 Player
模型和集合.每个玩家都有一个硬币的集合.我手动添加玩家应该获得的硬币类型.
I've got a simple setup going for the beginnings of an app in Backbone.js
The code is in this gist.
It is pretty straightforward. A Coin
model and collection, a Player
model and collection. Each Player has a collection of Coins. I manually add the type of Coins a player should be getting.
在initialize
结束时,每个玩家Coins
集合中有32个项目,Coins.player_id
设置为4个所有 4 名球员.
At the end of initialize
, each of the Players Coins
collection has 32 items in it and Coins.player_id
is set to 4 in all 4 Players.
我错过了什么?
推荐答案
我猜你的问题是你在Player
中的defaults
:
I'd guess that your problem is your defaults
in Player
:
var Player = Backbone.Model.extend({
defaults: {
id: 0,
name: '',
coins: new Coins()
},
//...
});
那个 defaults
将被浅复制到新的 Player
,所以他们最终都会共享完全相同的 coins: new Coins()代码>.每当
defaults
包含任何可变数据(即数组、对象文字等)时,都会发生类似的事情.所以所有这些:
That defaults
will be shallow-copied to new Player
s so they'll all end up sharing exactly the same coins: new Coins()
. Similar things happen whenever defaults
contains any mutable data (i.e. arrays, object literals, ...). So all of these:
this.Taylor.get("coins")
this.Sugar.get("coins")
this.Darlene.get("coins")
this.Cody.get("coins")
最终将成为完全相同的对象.精美手册有这样的说法:
will end up as the exact same object. The fine manual has this to say:
defaults model.defaults 或 model.defaults()
defaults 哈希(或函数)可用于指定模型的默认属性.创建模型的实例时,任何未指定的属性都将设置为其默认值.
[...]
请记住,在 JavaScript 中,对象是通过引用传递的,因此如果您包含一个对象作为默认值,它将在所有实例之间共享.
The defaults hash (or function) can be used to specify the default attributes for your model. When creating an instance of the model, any unspecified attributes will be set to their default value.
[...]
Remember that in JavaScript, objects are passed by reference, so if you include an object as a default value, it will be shared among all instances.
请注意最后的小警告.如果您使用 defaults
的函数:
Note that little caveat at the end. If you use a function for defaults
:
var Player = Backbone.Model.extend({
defaults: function() {
return {
id: 0,
name: '',
coins: new Coins()
};
},
//...
});
那么你应该为每个Player
获得不同的'coins'
.或者,您可以在 initialize
中手动设置 'coins'
:
then you should get distinct 'coins'
for each Player
. Alternatively, you could manually set 'coins'
in your 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...
},
//...
});
这篇关于Backbone Collection 不是唯一的吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!