Backbone.js获取更复杂的数据并用作集合

时间:2012-04-04 22:23:51

标签: backbone.js

假设我有一个这样的json设置:

{
  page:1,   
  items:[
    {  
      name: 'item1', 
      id:1
    }, 
    {
      name: 'item1', 
      id:2
    }, 
    {
      name: 'item1', 
      id:3
    }
  ] 
}

这样的建模:

var Item = Backbone.Model.extend({
    defaults: {name:  "No name"}
});

var ItemCollection = Backbone.Collection.extend({
    model: Item,
    url: '/some/ajax/url',
});

获取此json后,如何映射设置为ItemCollection集合的项目,并将页码作为属性添加到集合中?

2 个答案:

答案 0 :(得分:26)

正如@asawyer所提到的,你必须覆盖parse方法,但你不需要实际实例化每个项目,如果你返回项目数组,Backbone可以为你做。

请参阅collection.parse

的文档
  

解析 collection.parse(response)

     无论什么时候,

都会被Backbone调用   集合的模型由服务器在fetch中返回。功能   传递原始响应对象,并且应该将要添加的模型属性数组返回到集合。

您的代码可以写成

var ItemCollection = Backbone.Collection.extend({
    model: Item,
    url: '/some/ajax/url',

    parse: function(data) {
        this.page=data.page;
        return data.items;
    }
});

答案 1 :(得分:2)

您需要覆盖parse

它最终会看起来像这样:

class Item extends Backbone.Model
    defaults:
        name: "No name"

class ItemCollection extends Backbone.Collection
    model: Item
    url: '/some/ajax/url'
    parse: (data) ->
        items = []
        _.each data, (item) ->
            newItem = new Item
                id: item.id
                name: item.name
            items.push newitem
        items

(Coffeescript,但很容易转换成直接的javascript)

您的另一个选项是在以下位置找到的关系插件:

https://github.com/PaulUithol/Backbone-relational

我从来没有使用它,但我认为应该为你做解析映射。