我对Backbone很新,所以我可能会遗漏一些明显的东西。但是,我搜索了stackoverflow,但没有发现任何适合我的问题。
我的模型只有urlRoot:
Album = Backbone.Model.extend({
urlRoot: '/data/album.json'
});
json看起来像这样:
[{
"id": "01",
"title": "title1",
"artist": "artist1",
"tracks": [{
"track": "track1",
"url": "/music/101.mp3"
},
{
"track": "track2",
"url": "/music/102.mp3"
}]
},
{
"id": "02",
"title": "title2",
"artist": "artist2",
"tracks": [{
"track": "track1",
"url": "/music/201.mp3"
},
{
"track": "track2",
"url": "/music/202.mp3"
}]
}]
我可以获取数组中的对象:
album = new Album();
album.fetch();
album.toJSON(); --> //Object {0: Object, 1: Object}
在我的新模型上调用toJSON表明数组已正确获取。如果我展开每个对象,我会看到所有属性。
但是,当我尝试从数组中只获取一个对象时,它不起作用。
album = new Album({id: 01});
album.fetch()
album.toJSON(); --> // Object {id: 1}
我错过了什么?
答案 0 :(得分:1)
我建议您更改代码中的一些内容,并详细了解Backbone.Model
和Backbone.Collection
以及REST-ful资源如何表现自己。
在处理对象集合或所谓的资源(来自REST)时,尝试使用Backbone.Collection
。并向该集合提及适当的Backbone.Model
,该集合将代表您的集合中的单个项目。在您的情况下,/data/album
是资源。
为了演示它,让我们将您的示例更改为以下内容(我将使用不带json
扩展名的路由):
var Album = Backbone.Model.extend({
urlRoot: '/data/album',
// mention here defaults hash, add parse method if you need to change response
// from backend, add validations, add idAttribute if the name of
// unique identifier is not the id
});
var Albums = Backbone.Collection.extend({
url: '/data/album',
model: Album
});
var albums = new Albums();
albums.fetch();
现在你有Backbone.Model
的集合,最好在Backbone的方法中进行操作和使用。你可以使用混合的UnderscoreJS
方法做任何你想做的事情 - 过滤,排序,搜索带有id的模型等等。
每当您需要获取单个模型或资源的单个项目时,您需要了解Backbone.Model
将如何更改路径(urlRoot)。
当你这样做时:
var album = new Album({id: 1});
var album.fetch();
它将在您的案例GET '/data/album/1'
中触发对以下路由GET '/data/album.json/1'
的请求。
您可以通过几种方法解决问题:
更改后端API以响应没有json
扩展名的路由以及单个项目处理路由,例如/data/album/id
重写Backbone.Model
将id连接到url的方式。您可以重写Backbone.Model
parse
函数以支持带扩展名的路由。
如果您无法触及后端(最糟糕的方式),您可以保留旧的实现并添加一些解决方法,例如将Backbone.Model
方法添加到{{1}} ....实际上将开始表现得像Backbone.Collection,因为任何时候你需要单个项目,你需要获取所有的东西,并在那个混乱中找到所需的对象。
所以我建议你试试第一和第二选项。