Backbone Collection不是唯一的?

时间:2012-10-23 00:48:02

标签: javascript backbone.js

我在Backbone.js的应用程序的开头有一个简单的设置 代码位于this gist 这很简单。 Coin模型和集合,Player模型和集合。每个玩家都有一系列硬币。我手动添加玩家应该获得的硬币类型。

initialize结束时,每个玩家Coins集合中有32个项目,Coins.player_id在所有4个玩家中都设置为4。

我错过了什么?

1 个答案:

答案 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...
    },
    //...
});