使用父模型获取填充嵌套集合

时间:2011-06-09 12:18:33

标签: javascript backbone.js

我有嵌套集合的以下模型

var Mdl = Backbone.Model.extend({
  initialize: function() {

    // collection
    this.col1 = new NestedCollection();

  },
  ...
});

我想在一个请求中发送集合中模型和模型的数据,如下所示:

{
  att1: val,
  col1: [{obj1: val}, {...}]
}

我不确定将请求中的数据传递给嵌套集合(col1)的最佳方法。我做不到......

var Mdl = Backbone.Model.extend({
  initialize: function() {
    // collection
    this.col1 = new NestedCollection(this.get('col1');
  },
  ...
});

...因为在初始化时调用模型的解析函数尚未调用,这意味着属性col1为空,我想到的另一个解决方案是监听父模型中的更改。 ..

model.bind("change:tags", function() {
  model.col1.refresh(model.get('col1'));
});
然而,这个解决方案感觉有点沉重,可能会破坏任何

this.col1.bind("add", function() {})

this.col1.bind("remove", function() {})

集合上的功能设置。

有没有人知道这种“官方”的做法?

感谢。

1 个答案:

答案 0 :(得分:33)

“官方”方式是覆盖解析方法:

http://documentcloud.github.com/backbone/#Model-parse

在您的具体情况下,我可能会做的是,在parse方法中,从col1数据构建嵌套集合,从结果中删除它,然后将结果移交给。然后,Backbone将其余数据转换为属性。

我没试过这个,所以我不能100%确定它有效:

parse: function(response) {
  this.col1 = new NestedCollection(response.col1);
  delete response.col1
  return response
}

编辑:2012年11月28日

Harm指出,这可能不是最好的方法。原来的答案是在很久以前写的,最初的问题表明用户希望集合是模型上的属性(不是属性),但是Harm有一个观点,即将集合作为属性更加被接受这些天做的方式。

今天,您可以使用像Backbone-Relational这样的东西为您处理很多这样的东西,或者,如果您想自己做,并将集合作为模型属性,您可以执行以下操作:

Building = Backbone.Model.extend({
    parse: function(response) {
        console.log("Parse Called");
        response.rooms = new Rooms(response.rooms);
        return response;
    }
});
Room = Backbone.Model.extend({});
Rooms = Backbone.Collection.extend({
    model: Room
});

science_building = new Building();

science_building.fetch(
    {success: function(model,resp) {console.log(resp);}}
);

使用模型获取响应,如:

{ id: 1, 
  name: "Einstein Hall", 
  rooms: [
    {id:101, name:'Chem Lab'},
    {id:201, name:'Physics Lab'},
    {id:205, name:'Bio Lab'}
  ]
}

导致建筑模型允许:

science_building.get('rooms').get(101).get('name')   // ==> "Chem Lab"

一个有效的jsFiddle示例:http://jsfiddle.net/edwardmsmith/9bksp/