Arrays 从backbone.js中的json数组获取单个模型

Arrays 从backbone.js中的json数组获取单个模型,arrays,json,backbone.js,model,fetch,Arrays,Json,Backbone.js,Model,Fetch,我是个新手,所以我可能错过了一些明显的东西。但是,我搜索了stackoverflow,没有找到任何适合我的问题 我的模型只有urlRoot: Album = Backbone.Model.extend({ urlRoot: '/data/album.json' }); json如下所示: [{ "id": "01", "title": "title1", "artist": "artist1", "tracks": [{ "track": "track1",

我是个新手,所以我可能错过了一些明显的东西。但是,我搜索了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}
我错过了什么



我建议您更改代码中的一些内容,并阅读更多关于REST-ful资源的内容和行为


在处理对象集合或所谓的资源(来自REST)时,请尝试使用
Backbone.Collection
。并向该系列提及合适的
Backbone.Model
,该系列将代表您的系列中的单个项目。在您的情况下,
/data/album
是资源


为了演示它,让我们将您的示例更改为以下内容(我将使用不带
json
扩展名的路由):

现在您有了
Backbone.Model
s的集合,它更易于在主干方法中操作和使用。您可以使用混合
下划线js
方法对其执行任何操作-过滤、排序、搜索id为的模型等等

每当您需要获取单个模型或资源的单个项时,您都需要了解
Backbone.model
将如何更改路由(urlRoot)

执行此操作时:

var album = new Album({id: 1});
var album.fetch(); 
在您的情况下,它将触发对以下路径的请求
GET'/data/album/1'


您有几个选项可以解决您的问题:

  • 更改后端API以响应不带
    json
    扩展名的路由,以及单个项目句柄路由,如
    /data/album/id

  • 重写将id连接到url的方式。您可以重写主干网.Model的函数,以支持带有扩展的路由

  • 如果您不能接触后端(最糟糕的方式),您可以保留旧的实现,并添加一些解决方法,例如将
    parse
    方法添加到
    主干.Model
    。。。。实际上,它将开始表现得像一个主干.Collection,因为任何时候你需要一个项目,你需要获取所有的东西,并在混乱中找到所需的对象


  • 因此,我建议您尝试混合使用第一和第二选项

    您是否已将后端API配置为响应像
    /data/album/1.json这样的路由?您是否处理了此问题?是的,这两条评论都为我指明了正确的方向。
    
    var album = new Album({id: 1});
    var album.fetch();