2012-10-23 65 views
0

我有一個簡單的設置去Backbone.js中的應用程序的開始
代碼是在this gist
這很簡單。 A​​模型和集合,Player模型和集合。每個玩家都有一堆硬幣。我手動添加玩家應該獲得的硬幣類型。骨幹系列不唯一?

initialize結束時,各玩家Coins集合中有32個項目,並且Coins.player_id在所有4個玩家中都設置爲4。

我錯過了什麼?

回答

3

我猜你的問題是你defaultsPlayer

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

defaults將是淺複製到新Player S左右,他們都會最終完全一樣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。另外,您也可以手動在您的initialize設置'coins'

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... 
    }, 
    //... 
}); 
+1

非常感謝您!我不知道在Defaults中通過引用完成的對象....對不起,我修改了一些過去的項目..... –