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

designing application with backbone model and collection

本文关键字:集合 应用程序 模型      更新时间:2023-09-26

我正在尝试使用backbone编写我的应用程序,我对它相当陌生。我的应用基本上是向用户显示他所有的照片和相册。我对它的设计有一些疑问。

首先,photo是一个明显的候选模型。所以

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

那么我就创建了一个照片集。

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

这是用来显示用户"所有照片","在特定日期上传的照片"等(注意它不同于相册)

现在我的问题是关于专辑,专辑是模型还是集合?

在相册视图中,我将显示用户所有的相册在网格布局与照片数量和相册名称和一些其他属性。因此,将专辑作为主干模型,将专辑集合作为主干集合是有意义的。

但是当用户点击相册时,我需要请求相册中的所有照片。这样,专辑就变成了一个集合。但是如果我把album写成collection,我该如何表示一组专辑呢?会是一系列的收藏品吗?

根据经验,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可能不仅仅是一个照片的集合——它将有一个标题和其他类似的属性。在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({ ... });

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