Backbone.js为什么我的默认模型出现在提取的集合中?

时间:2014-09-29 20:47:41

标签: backbone.js backbone.js-collections

我确定我错过了一些非常基本的东西。我正在设置一个已获取对象的集合

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 个答案:

答案 0 :(得分: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(false,null等)项在转换为模型并接收默认值之前都会转换为空对象。

无论

  • 修改服务器响应以删除虚假值
  • 或更改您的parse方法以清理阵列

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