2011-06-09 70 views
10

我有嵌套的收集提供了以下型号填充与父模型嵌套集合取

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() {}) 

集合上的函数设置。

有没有人知道这样做的“官方”方式?

谢谢。

回答

33

“官方”的方法是重写解析方法:

http://documentcloud.github.com/backbone/#Model-parse

在特定情况下,我可能会做的是,在分析方法,从COL1数据建立嵌套集合,将其从结果中删除,然后将结果交给。骨干会将其余的数据转换成属性。

我还没有试过,所以我不是100%肯定它的工作原理:

parse: function(response) { 
    this.col1 = new NestedCollection(response.col1); 
    delete response.col1 
    return response 
} 

编辑:2012年11月28日

危害指出,这可能不是最好的办法再做一次。最初的答案是很早以前写的,原来的问题表明用户希望集合是模型上的一个属性(而不是属性),但是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);}} 
); 

与模型获取响应,如:

science_building.get('rooms').get(101).get('name') // ==> "Chem Lab" 

{ id: 1, 
    name: "Einstein Hall", 
    rooms: [ 
    {id:101, name:'Chem Lab'}, 
    {id:201, name:'Physics Lab'}, 
    {id:205, name:'Bio Lab'} 
    ] 
} 

在建筑模型,让所得的0

工作jsFiddle示例:http://jsfiddle.net/edwardmsmith/9bksp/

+0

完美,非常感谢! – luxerama 2011-06-09 17:52:47

+1

我不完全同意这个解决方案。 'parse()'应该返回一堆attrs。现在它具有直接在模型上设置某些东西的一些奇怪的副作用。也许用适当的主干集合替换集合密钥的内容更好。 – harm 2012-11-28 14:22:42

+0

+1复出 – 2013-04-27 09:59:16