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

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

...因为在调用initialize的时候模型的parse函数还没有被调用这意味着属性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-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/

关于javascript - 使用父模型提取填充嵌套集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6292667/

相关文章:

javascript - 如何使用比较器按多个属性排序?

javascript - 如何在 Angular 上使用 Ajax

javascript - 与文本框相关的 HTML 编码/解码

javascript - JavaScript 中的 If/and/if 语句

javascript - 当跟进请求的答案是 204 时,为什么 OPTIONS 请求会失败?

ruby-on-rails - 单页应用程序上的cancan

javascript - 将输入框滚动到javascript中的光标位置

javascript - 在 jqGrid ColumnChooser 上添加删除列处理程序

ruby-on-rails - 是否有允许我只定义一次模型的框架?

javascript - Backbone.js:为每个模型添加验证