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