2012-12-03 192 views
8

我嘗試使用骨幹js創建集合集合時遇到了isssue問題。 下面是代碼:骨幹js集合問題

模型和類別:

var Track = Backbone.Model.extend({ 

    defaults : { 
     title : "" 
    } 
}) 

var TrackCollection = Backbone.Collection.extend({ 

    model : Track, 
}) 

var Playlist = Backbone.Model.extend({ 

    defaults : { 
     name : "", 
     tracks : new TrackCollection, 
    } 
}) 

var PlaylistCollection = Backbone.Collection.extend({ 

    model : Playlist, 
}) 

創作播放列表集合的:

var playlists = new PlaylistCollection; 

// create and push the first playlist 
playlists.push({ name : "classic" }); 
// create and push a track in the playlist just created 
playlists.last().get("tracks").push({ title : "fur elise" }); 

// create and push the second playlist 
playlists.push({ name : "c2c" }); 
// create and push a track in the playlist just created 
playlists.last().get("tracks").push({ title : "fuya" }); 

// display first playlist 
console.log(JSON.stringify(playlists.at(0).toJSON())) 
// display second playlist 
console.log(JSON.stringify(playlists.at(1).toJSON())) 

這裏是輸出:

{"name":"classic","tracks":[{"title":"fur elise"},{"title":"fuya"}]} 
{"name":"c2c","tracks":[{"title":"fur elise"},{"title":"fuya"}]} 

問題是,正如我們在輸出中可以看到的那樣,這兩個播放列表中有兩個曲目「fur elise」和「fuy」一個」。

所以我的問題是爲什麼?我應該怎麼做才能在名爲「c2c」的第二個播放列表中僅在名爲「classic」和「fuya」的第一個播放列表中具有「fur elise」?

謝謝。

回答

8

我覺得你的問題是你的默認tracks屬性在PlayList:創建新實例時

var Playlist = Backbone.Model.extend({ 
    defaults : { 
     name : "", 
     tracks : new TrackCollection, 
    } 
}); 

骨幹將淺拷貝defaults

默認model.defaults or model.defaults()
[.. 。]
請記住,在JavaScript中,對象s是通過引用傳遞的,所以如果你包含一個對象作爲默認值,它將在所有實例之間共享。

結果是使用默認tracks每一個PlayList例如將使用完全相同的TrackCollectiontracks屬性和TrackCollection將是一個在defaults引用。

最簡單的解決方法是使用一個功能defaults

var Playlist = Backbone.Model.extend({ 
    defaults : function() { 
     return { 
      name : "", 
      tracks : new TrackCollection, 
     }; 
    } 
}); 

這樣需要的默認值時,defaults功能將被調用,每次defaults是叫你將在得到一個全新的TrackCollection默認tracks屬性。

這裏的拇指快速規則你:

如果你想放不是字符串,數字或者布爾其他任何東西defaults,而不是使用一個defaults對象defaults功能。

+0

你是完全正確的,我認爲它是在實例化的默認值副本。無論如何,非常感謝您的回覆! – Kraoz

+0

這是非常好的信息,非常貼切,但是在初始化方法中創建一個新的集合可能更簡單,更清楚嗎? –

+1

@AlexMills:也許吧。我對他們的情況不夠了解。這個答案更像是「如果你要這樣做,那就這樣做」。 –