2014-09-29 22 views
1

我確定我錯過了一些非常基本的東西。我設置了基於包含一個「默認」屬性的模型獲取對象Backbone.js爲什麼我的默認模型存在於抓取的集合中?

collection.fetch({reset: true})

的集合。

但是,當我在控制檯中查看抓取的集合時,我有一個額外的模型,它使用默認屬性進行設置。這是爲什麼發生?更重要的是,我如何防止它?

var diningApp = diningApp || {}; 

(function(){ 
"use strict"; 

diningApp.MenuItem = Backbone.Model.extend({ 
    defaults: { 
     service_unit: null, 
     course: null, 
     formal_name: null, 
     meal: null, 
     portion_size: null, 
     service_unit_id: null 
    } 
}); 

var MenuCollection = Backbone.Collection.extend({ 
    model: diningApp.MenuItem, 

    url: '/api/dining/get_menus', 

    parse: function(response){ 
     return response.menu_items; 
    } 
}); 

diningApp.menuCollection = new MenuCollection(); 
diningApp.menuCollection.fetch({reset: true}); 
})(); 

下面是來自服務器的JSON響應的一部分:

{ 
    "status": "ok", 
    "menu_items": [ 
    { 
    "service_unit": "Faculty House", 
    "course": "Entrees", 
    "formal_name": "Local CF Fried Eggs GF", 
    "meal": "BREAKFAST", 
    "portion_size": "1 Egg", 
    "service_unit_id": 0 
    }, 
    { 
    "service_unit": "Faculty House", 
    "course": "Entrees", 
    "formal_name": "CageFree Scrambled Eggs GF", 
    "meal": "BREAKFAST", 
    "portion_size": "2 eggs", 
    "service_unit_id": 0 
    }] 
} 

下面是在控制檯的結果集合:

enter image description here

+1

什麼的'/ API做的JSON/dining/get_menus'看起來像? – 2014-09-29 21:07:46

+0

編輯爲包含JSON響應。 – lancemonotone 2014-09-30 15:46:22

+3

@lancemonotone它似乎與你給的示例數據一起工作http://jsfiddle.net/nikoshr/cjd7syoh/在完整的JSON中的某處有一個未定義/空/空元素? http://jsfiddle.net/nikoshr/cjd7syoh/1/ – nikoshr 2014-09-30 16:55:54

回答

1

如果你挖一個位到Backone的源代碼來檢查重置集合時會發生什麼,您將會看到Collection.set。感興趣的問題了的行是:

// Turn bare objects into model references, 
// and prevent invalid models from being added. 
for (i = 0, l = models.length; i < l; i++) { 
    attrs = models[i] || {}; 
    // ... 

這意味着每個falsy(假的,空等)項陣列中的被澆注到模型和接收默認值之前被轉換爲一個空對象。

要麼

  • 修改服務器響應刪除falsy值
  • 或者改變您的parse方法來清理你陣列

    parse: function(response){ 
        return _.compact(response.menu_items); 
    } 
    
+0

_.compact是一個不錯的解決方案。我覺得Backbone中的這種行爲應該被公佈,因爲開發人員不可能總是控制服務器響應。無論如何,感謝您的幫助。非常感激。 – lancemonotone 2014-10-01 12:30:58

相關問題