2012-04-30 30 views
48

私はbackbone.jsでコレクションのコレクションを作成する方法を理解しようとしています。私はバックボーンにはかなり新しいです。私は、次のような状況のようなものがありますと言って、私は常に、JSコンソールにエラーが表示さしかしBackbone.jsコレクションのコレクション

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 
}); 

:コードで

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

この本に似ていますが

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

私はバリデーションをトリガする関数(add、fetch、...のような)を実行しようとします。

それmどのようなコレクションやモデルにvalidateまたは_validate関数を追加しても違いはありません。

これは、backbone.jsがコレクションのコレクションをサポートしていないためです。そこに別の方法がありますか?

UPDATE:

これは、それがモデルにコレクションからあなたのPlaylistを回して、今

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つの場所にグループ化されたプレイリストオブジェクトが多数ある)、データには "プレイリスト" 1つのプレイリストには多くのトラックを持つことができるリレーションがあります。あなたの単純な(解決された)例では、このパターンはきれいに見えます。 – Dainius

答えて

30

あなたはあなたの問題を解決したいどのように見えるかです。それについて考えると、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({ モデル:Track; }); var Playlist = Backbone.Model.extend({ モデル:トラック }); var Playlists = Backbone.Collection.extend({ url: "プレイリスト"、 モデル:Playlist }); サーバーとの同期に問題なくすべてが動作することを願っています。 – krial

+0

私は、そのアプローチがうまくいくかどうかは分かりません。単に 'Backbone.Collection'(つまり' Tracks')の拡張を別のコレクションのモデルとして設定することはできません。 'Track'をあなたの' Playlist.model'にしておきたいのですが、 'Tracks'コレクションを使って同期をとることができます。 –

+0

質問のコードを更新しました。別のコレクションのモデルとしてコレクションを設定しませんでした。私は、モデルプレイリスト(モデルを拡張)の属性として、コルレクション(トラック)を設定しました。 Playlist-> model:track'のようにプレイリスト内に1つのトラックしか格納できませんでした。なぜならPlaylistはモデルを拡張しており、Modelは属性モデルのコレクションを作る方法がないからです...または私は間違っていますか? – krial

関連する問題