设计具有骨干模型和集合的应用程序
designing application with backbone model and collection
我正在尝试使用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并不是那么固执己见,你可以自由地按照你想要的方式设置。通常用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({ ... });
在不了解应用程序外观的情况下很难进一步推测,但无论如何,这都是一种自然的方法。
- Canvas Html5绘图应用程序,移动画布会导致重大问题
- Emberjs应用程序加载在除Index之外的所有路由上
- 使用电话间隙在Android应用程序中显示SQL Lite的数据
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- angular 1.5应用程序中的导航栏
- 在Web应用程序中使用Highcharts javascript
- angularjs+rails应用程序中未显示模板
- 使用acess代币登录Facebook,并通过网络应用程序离线发布
- 从HTTPGET返回一个自定义对象列表,以便在Angular 2应用程序中使用
- Ng在同一集合上重复,通过应用程序多次使用
- 在 Meteor React 应用程序中使用 Mongo 集合时,返回一个空数组 []
- 在猫鼬查询返回集合之前,应用程序应该如何处理 http get 响应
- 流星:通过 DDP 连接两个应用程序时,模板帮助程序中没有来自远程集合的文档
- 使用Backbone.js在待办事项中对数据集合进行分页.js Web应用程序
- 我应该使用嵌套集合来组织我的backbone.js应用程序吗
- 在Backbone/胸腔应用程序中实例化我的集合的位置
- BackboneJs:在应用程序的整个生命周期中使用部分获取而不是 1 个集合
- 简单的todos应用程序教程,试图创建一个函数,从Mongo集合中删除选中的任务
- 设计具有骨干模型和集合的应用程序