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

时间:2015-01-10 19:23:10

标签: arrays json backbone.js model fetch

我对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}

我错过了什么?


1 个答案:

答案 0 :(得分:1)

我建议您更改代码中的一些内容,并详细了解Backbone.ModelBackbone.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'的请求。


您可以通过几种方法解决问题:

  1. 更改后端API以响应没有json扩展名的路由以及单个项目处理路由,例如/data/album/id

  2. 重写Backbone.Model将id连接到url的方式。您可以重写Backbone.Model parse函数以支持带扩展名的路由。

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

  4. 所以我建议你试试第一和第二选项。