我确定我错过了一些非常基本的东西。我正在设置一个已获取对象的集合
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
}]
}
以下是控制台中的结果集合:
答案 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);
}