我有以下带有嵌套集合的模型
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/