根据经验,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