0

我在 Backbone.js 中为应用程序的开始做了一个简单的设置
。代码在这个 gist中。
这很简单。一个Coin模型和集合,一个Player模型和集合。每个玩家都有一组硬币。我手动添加玩家应该获得的硬币类型。

在 结束时initialize,每个 PlayersCoins集合中有 32 个项目,并且Coins.player_id在所有 4 个 Players 中设置为 4。

我错过了什么?

4

1 回答 1

3

我猜你的问题是你defaultsPlayer

var Player = Backbone.Model.extend({
    defaults: {
        id: 0,
        name: '',
        coins: new Coins()
    },
    //...
});

defaults将被浅复制到 new Players,因此它们最终都会共享完全相同的 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...
    },
    //...
});
于 2012-10-23T01:31:07.547 回答