経験則として、 はBackbone.Collection
1 つの REST コレクション リソースにマップし、Model
はそのコレクション内の 1 つのアイテムにマップする必要があります。厳密に必要というわけではありませんが、Backbone の大部分はこの考え方に基づいて構築されています。次に例を示します。
/photos -> PhotoCollection
/photos/id -> Photo
/albums -> AlbumCollection
/albums/id -> Album
このような明確な RESTful 構造がある場合は、それを反映するモデル構造を構築することをお勧めします。
異なるモデル間の関係を構築し始めると、Backbone はそれほど独断的ではなく、自由に設定できます。多くの場合、異なるモデル間の関係を と の関係で考えるのが最も簡単is
ですhas
。あなたの場合、それは少しトリッキーAlbum is a collection of photos
ですAlbum has photos
。
主におそらく写真のコレクション以上のものであるため、私はhas
ここで関係に傾倒します-それはタイトルやその他の独自のプロパティを持ちます. Album
RESTful 用語では、コレクションは独自のプロパティを持つことはできません。だから私たちはそう言いAlbum has a PhotoCollection
ます。
Photo
これらがあなたのand であるとしましょうPhotoCollection
:
var Photo = Backbone.Model.extend({});
var PhotoCollection = Backbone.Collection.extend({
model: Photo,
filterByDate: function(date) {
//just some method
return this.filter(function(photo) { return photo.get('date') === date; });
}
});
同様にAlbum
and AlbumCollection
.
var Album = Backbone.Model.extend({
initialize: function(attributes) {
//make model.photos a PhotoCollection and initialize it with passed photos
this.set('photos', new PhotoCollection(attributes.photos || []);
}
});
var AlbumCollection = Backbone.Collection.extend({
model: Album
});
次に、他の写真のコレクションと同じように、アルバムの写真にアクセスできます。
album.get('photos').filterByDate('2012-12-24');
アルバムPhotoCollection
が通常の とは異なる動作をする必要がある場合PhotoCollection
は、単純に基本コレクションから拡張して代わりに使用できます。
var AlbumPhotoCollection = PhotoCollection.extend({ ... });
アプリケーションがどのように見えるかを詳しく知らずにこれ以上推測することは困難ですが、いずれにせよ、これは自然な方法のように感じられます。