lux*_*ama 10 javascript backbone.js
我有嵌套集合的以下模型
var Mdl = Backbone.Model.extend({
initialize: function() {
// collection
this.col1 = new NestedCollection();
},
...
});
Run Code Online (Sandbox Code Playgroud)
我想在一个请求中发送集合中的模型和模型的数据,如下所示:
{
att1: val,
col1: [{obj1: val}, {...}]
}
Run Code Online (Sandbox Code Playgroud)
我不确定将请求中的数据交给嵌套集合(col1)的最佳方法.我做不到......
var Mdl = Backbone.Model.extend({
initialize: function() {
// collection
this.col1 = new NestedCollection(this.get('col1');
},
...
});
Run Code Online (Sandbox Code Playgroud)
...因为在初始化时调用模型的解析函数尚未调用,这意味着属性col1为空,我想到的另一个解决方案是监听父模型中的更改,如...
model.bind("change:tags", function() {
model.col1.refresh(model.get('col1'));
});
Run Code Online (Sandbox Code Playgroud)
然而,这个解决方案感觉有点沉重,可能会破坏任何
this.col1.bind("add", function() {})
Run Code Online (Sandbox Code Playgroud)
和
this.col1.bind("remove", function() {})
Run Code Online (Sandbox Code Playgroud)
集合上的功能设置.
有没有人知道这样做的"官方"方式?
谢谢.
Edw*_*ith 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
}
Run Code Online (Sandbox Code Playgroud)
编辑: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);}}
);
Run Code Online (Sandbox Code Playgroud)
使用模型获取响应,如:
{ id: 1,
name: "Einstein Hall",
rooms: [
{id:101, name:'Chem Lab'},
{id:201, name:'Physics Lab'},
{id:205, name:'Bio Lab'}
]
}
Run Code Online (Sandbox Code Playgroud)
导致建筑模型允许:
science_building.get('rooms').get(101).get('name') // ==> "Chem Lab"
Run Code Online (Sandbox Code Playgroud)
一个有效的jsFiddle示例:http://jsfiddle.net/edwardmsmith/9bksp/
| 归档时间: |
|
| 查看次数: |
6282 次 |
| 最近记录: |