0

Backbone.js でアプリを開始するための簡単なセットアップがあります。
コードはこの gistにあります。
それはかなり簡単です。Coinモデルとコレクション、モデルPlayerとコレクション。各プレイヤーはコインのコレクションを持っています。プレイヤーが獲得すべきコインの種類を手動で追加します。

の最後でinitialize、各 PlayersCoinsコレクションには 32 個のアイテムがあり、Coins.player_id4 つの Players すべてで 4 に設定されています。

私は何が欠けていますか?

4

1 に答える 1

3

defaultsあなたの問題はあなたの中にあると思いますPlayer

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

それdefaultsは new に浅くコピーされるPlayerため、それらはすべてまったく同じ を共有することになります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 に答える