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