我有嵌套集合的以下模型
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() {})
集合上的功能设置。
有没有人知道这种“官方”的做法?
感谢。
答案 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/