2013-02-01 52 views
0

在我的申請,我有以下的JSON數據格式:如何初始化嵌套Backbone.js的車型

{ 
    Item: { 
     property1: '', 
     ... 
    } 
} 

this stackoverflow.com答案的解決方案,我模仿我Backbond.js模型通過以下方式:

App.Models.Item = Backbone.Model.extend({ 

}); 

App.Models.ItemData = Backbone.Model.extend({ 
    defaults: { 
     'Item': new App.Models.Item 
    } 
}); 

我現在想從頁面上的後端系統bootstap數據,以我的應用程序加載方式如下:

var item = App.Models.ItemData({ 
    {Item: 
     {property1: 'data'} 
    } 
}); 

我現在的問題是,item.get('Item')返回一個普通的JavaScrip對象,而不是Backbone.Model對象,因爲默認值被覆蓋。 如何在確保item.get('Item')是App.Models.Item對象時創建Backbone.js對象?

我也讀過,如果你嵌套Backbone.Models,你應該wirite自定義getter方法,所以你的應用程序的其餘部分不必知道內部數據結構。如果是這樣,那麼執行這些制定者和獲得者的正確方法是什麼?

回答

2

您可以覆蓋ItemData型號上的parse方法。不需要defaults。 parse方法將初始化一個空的模式,如果不通過:

App.Models.ItemData = Backbone.Model.extend({ 
    parse: function(attrs) { 
    attrs = attrs || {}; 
    if(!(attrs.Item instanceof App.Models.Item)) 
     attrs.Item = new App.Models.Item(attrs.Item); 

    return attrs; 
    } 
}); 

然後用選項parse:true初始化ItemData型號:

var item = new App.Models.ItemData({Item:{property1: 'data'}}, {parse:true}); 
+0

感謝您的快速反應!只有兩個小問題:1.爲什麼我們需要「attrs = attrs ||」 {};'? 2.我不得不將'if(!attrs.Item instanceof App.Models.Item)'改成'if(!(attrs.Item instanceof App.Models.Item))'來工作。那裏發生了什麼? – wowpatrick

+0

@wowpatrick,如果有人向方法傳遞一個null/undefined值,那麼'attrs'到'{}'的默認值就是一個警戒,在這種情況下,屬性訪問'attrs.Item'會導致錯誤。你也可以做'if(attrs){...}'但這是我通常這樣做的。 – jevakallio

+0

還在'instanceof'檢查中添加了缺失的括號,對此感到抱歉。如果沒有參數,首先會評估'!attrs.Item',並返回一個布爾值,該值從來就不是'instanceof'。 – jevakallio