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



我得到了以下带有嵌套集合的模型

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');
  },
  ...
});

因为在调用initialize时,还没有调用模型的解析函数,这意味着属性col1为空,所以我想到的另一个解决方案是侦听父模型中的更改,比如。。。

model.bind("change:tags", function() {
  model.col1.refresh(model.get('col1'));
});

然而,这种解决方案感觉有点过于严厉,可能会破坏任何

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

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

集合上的功能设置。

有人知道这样做的"官方"方式吗?

谢谢。

"官方"方法是覆盖解析方法:

http://documentcloud.github.com/backbone/#Model-解析

在您的特定情况下,我可能会做的是,在解析方法中,从col1数据构建嵌套集合,将其从结果中删除,然后将结果传递给Backbone。然后,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/

最新更新