2011-06-09 67 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