2

我正在嘗試使用主幹來編寫我的應用程序,我對它很新。我的應用程序基本上是向用戶顯示他的所有照片和相冊。我有一些關於它的設計的問題。設計與骨幹模型和集合的應用程序

從照片開始就是模特的明顯候選人。所以

var Photo = Backbone.Model.extend({}) 

然後我創建了一個照片集合。

var PhotoCollection = Backbone.Collection.extend({}) 

這是用於顯示用戶「所有照片」,「上傳的特殊日期的照片」等。(注意它比專輯不同)

現在我的問題是關於專輯,這張專輯將是一個模型或採集?

在專輯視圖中,我將以網格佈局向用戶顯示他的所有相冊,包括照片和相冊名稱以及一些其他屬性的數量。因此,將專輯設置爲Backbone模型並將專輯集合作爲Backbone集合是有意義的。

但是當用戶點擊相冊時,我必須請求該相冊內的所有照片。那麼,專輯就成了一個集合。但是如果我把專輯寫成集合,我該如何表現一組專輯?它會是一個集合的集合嗎?

我希望它不會讓人困惑。

回答

5

根據經驗,Backbone.Collection應映射到一個REST集合資源,並將Model映射到該集合中的一個項目。這不是必須的,但Backbone的大部分都是圍繞這種思維方式構建的。這裏有一個例子:

/photos -> PhotoCollection 
/photos/id -> Photo 
/albums -> AlbumCollection 
/albums/id -> Album 

如果你有一個明確的RESTful結構是這樣,那麼我建議你建立你的模型結構,以反映它。

當你開始在不同的模型之間建立關係時,骨幹不那麼自以爲是,你可以自由設置你想要的方式。通常,根據ishas的關係來考慮不同模型之間的關係是最簡單的。在你的情況下,這有點棘手,因爲有人可能會認爲Album is a collection of photos,但也是Album has photos

我會傾向於has這裏的關係,主要是因爲Album可能不僅僅是一組照片 - 它會有一個標題和其他這樣的屬性。在RESTful術語中,集合不能擁有任何屬性。所以我們說Album has a PhotoCollection

比方說,這些都是你的PhotoPhotoCollection

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

而且同樣的AlbumAlbumCollection

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({ ... }); 

很難進一步猜測不知道更多關於你的應用程序的外觀,但在任何情況下,這會覺得這樣做自然的方式。

+0

寫得很好,經過深思熟慮的答案。非常感謝。 – sublime