用骨干模型和集合设计应用程序

时间:2013-01-07 19:26:46

标签: javascript model-view-controller design-patterns backbone.js

我正在尝试使用骨干编写我的应用程序,而且我对它很新。我的应用程序基本上向用户显示他的所有照片和相册。我对它的设计有一些疑问。

从照片开始是模型的明显候选者。所以

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

然后我创建了一系列照片。

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

这是为了向用户显示“所有照片”,“在特定日期上传的照片”等(注意与专辑不同)

现在我的问题是关于专辑,专辑是模特还是收藏?

在专辑视图中,我将以网格布局向用户展示他的所有专辑,其中包括照片和专辑名称以及其他一些属性。因此,将专辑作为Backbone模型和专辑集合作为Backbone集合是有意义的。

但是当用户点击相册时,我必须请求该相册中的所有照片。所以,然后专辑成为一个集合。但如果我把专辑写成收藏,我该如何代表一组专辑呢?它会是收藏品的集合吗?

我希望这听起来并不令人困惑。

1 个答案:

答案 0 :(得分:5)

根据经验,Backbone.Collection应该映射到一个REST集合资源,Model映射到该集合中的一个项目。这并不是绝对必要的,但Backbone的大部分都是围绕这种思维方式构建的。这是一个例子:

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

如果你有一个像这样的清晰RESTful结构,那么我建议你构建你的模型结构来反映它。

当您开始在不同模型之间构建关系时,Backbone并不那么自以为是,您可以按照自己想要的方式自由设置。通常,在ishas关系方面考虑不同模型之间的关系通常是最简单的。在你的情况下,这有点棘手,因为人们可以认为Album is a collection of photos,而且Album has photos

我会倾向于has这里的Album关系,主要是因为Album has a PhotoCollection可能不仅仅是一组照片 - 它将拥有自己的标题和其他类似属性。在RESTful术语中,集合不能拥有自己的任何属性。所以我们说Photo

我们说这些是您的PhotoCollectionvar 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

同样是AlbumCollectionvar 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({ ... }); 具有不同的行为,则只需从基本集合扩展并使用它即可。

{{1}}

如果不了解应用程序的外观,很难进一步推测,但无论如何这都是一种自然的方式。