根據經驗,Backbone.Collection
應映射到一個REST集合資源,並將Model
映射到該集合中的一個項目。這不是必須的,但Backbone的大部分都是圍繞這種思維方式構建的。這裏有一個例子:
/photos -> PhotoCollection
/photos/id -> Photo
/albums -> AlbumCollection
/albums/id -> Album
如果你有一個明確的RESTful結構是這樣,那麼我建議你建立你的模型結構,以反映它。
當你開始在不同的模型之間建立關係時,骨幹不那麼自以爲是,你可以自由設置你想要的方式。通常,根據is
和has
的關係來考慮不同模型之間的關係是最簡單的。在你的情況下,這有點棘手,因爲有人可能會認爲Album is a collection of photos
,但也是Album has photos
。
我會傾向於has
這裏的關係,主要是因爲Album
可能不僅僅是一組照片 - 它會有一個標題和其他這樣的屬性。在RESTful術語中,集合不能擁有任何屬性。所以我們說Album has a PhotoCollection
。
比方說,這些都是你的Photo
和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
和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({ ... });
很難進一步猜測不知道更多關於你的應用程序的外觀,但在任何情況下,這會覺得這樣做自然的方式。
寫得很好,經過深思熟慮的答案。非常感謝。 – sublime