2012-04-30 37 views
48

我想弄清楚如何製作與backbone.js集合的集合。我對骨幹很陌生。我有類似如下的情況:Backbone.js收藏集

+---------------+    +------------------+ 
| Playlists  |    | Playlist   | 
|---------------|   0..* |------------------| 
|    +-------------->| Name    | 
|    |    |     | 
|    |    |     | 
+---------------+    +-------+----------+ 
             | 
             | 
             |0..* 
             v 
           +------------------+ 
           | Track   | 
           |------------------| 
           | Name    | 
           | Artist   | 
           |     | 
           +------------------+ 

在代碼中,這看起來與此類似:

var trackModel = Backbone.Model.extend({ 
    //trackdata 
}); 

var playlistModel = Backbone.Collection.extend({ 
    model : trackModel, 
    url : "playlist" 
}); 

var playlistsModel = Backbone.Collection.extend({ 
    url : "playlists", 
    model : playlistModel //This pretty sure doesn't work like I want, because there is no model attribute for collections :S 
}); 

但是我總是在JS控制檯收到一條錯誤消息:

Uncaught TypeError: Object [object Object] has no method '_validate' 

時我嘗試執行觸發驗證的函數(如add,fetch,...)

它m如果我將validate_validate函數添加到任何集合或模型,則不會產生任何差異。

我相信這是因爲backbone.js不支持集合中的集合。有另一種方法可行嗎?

UPDATE:

這是它的外觀,現在

var Track = Backbone.Model.extend({ 
    //trackdata 
}); 

var Tracks = Backbone.Collection.extend({ 
    model:Track; 
}); 

var Playlist = Backbone.Model.extend({ 
    //name : ... 
    tracks: new Tracks() 
}); 

var Playlists = Backbone.Collection.extend({ 
    url : "playlists", 
    model : Playlist 
}); 
+0

貌似骨幹文檔現在包括嵌套模式與類別,非常相似,這裏的示例部分:http://backbonejs.org/#FAQ-nested –

+0

首先 - 很高興你解決你的問題。希望這會成爲其他人的答案,但是你的問題是由於錯誤定義數據模型而產生的 - 沒有「播放列表」(你只有很多播放列表對象,它們被分組到一個地方),你的數據只包含「播放列表」和「跟蹤「,並且存在關係1播放列表可以有很多曲目。在你簡單的(已解決的)例子中,這個模式非常明顯。 – Dainius

回答

30

你會解決你的問題,可通過翻轉Playlist從收集到的模型。如果你仔細想想,Playlist可能會有其他屬性(例如名稱),這些屬性無法在集合上設置。

Playlists然後將是Playlist模型(而不是集合)的集合,它應該沒有錯誤地工作。

var Track = Backbone.Model.extend({ 
    //trackdata 
}); 

var Playlist = Backbone.Model.extend({ 
    model : Track 
}); 

var Playlists = Backbone.Collection.extend({ 
    url : "playlists", 
    model : Playlist 
}); 
+0

謝謝,似乎完美地工作:d 不過,我需要補充收集,因爲播放列表可以有多個音軌: VAR軌道= Backbone.Model.extend({// trackdata }); var Tracks = Backbone.Collection.extend({model:Track; }); var Playlist = Backbone.Model.extend({model:Tracks }); var播放列表= Backbone.Collection.extend({url:「播放列表」, model:播放列表 }); 我希望一切都可以在與服務器同步的情況下正常工作。 – krial

+0

我不確定這種方法是否可行 - 您無法將「Backbone.Collection」(即「曲目」)的擴展設置爲另一個集合的模型。儘管如此,您仍然希望將「Track」保留爲「Playlist.model」,並且仍然可以使用「Tracks」集合來幫助實現同步。 –

+0

我已經更新了問題中的代碼。我沒有將集合設置爲另一個集合的模型。我將colelction(Tracks)設置爲模型播放列表(擴展模型)的一個屬性。如果我願意按照你在答案:'Playlist-> model:track'中所說的那樣完成它,我只能在播放列表中存儲一條軌道,因爲播放列表擴展了模型,並且模型沒有方法來創建屬性Model的集合...或者我錯了嗎? – krial