我试图将Backbone与API一起使用。
默认的API响应格式为:
{
somemetadatas:xxx ,
results:yyy
}
是否为单个模型或集合提取。
据我所知,我可以使用:
覆盖Backboneparse
函数
parse: function (response) {
return response.results;
},
但我在the documentation中看到过:
解析
无论何时,Backbone都会调用collection.parse(response)
解析 服务器在获取时返回集合的模型。该 函数传递原始
response
对象,并应返回 要添加到集合的模型属性数组。默认 实现是一个无操作,只是通过JSON响应。 如果您需要使用预先存在的API或更好的API,请覆盖此项 命名空间你的回答请注意,之后,如果您的模型类 已经有一个parse
函数,它将针对每个获取的函数运行 模型。
所以,如果我对这样的集合提取有响应:
{
somemetadatas:xxx ,
results:[user1,user2]
}
集合中的第一个parse
函数将提取[user1,user2]
。
但是医生说:
注意事后,如果您的模型类 已经有一个
parse
函数,它将针对每个获取的函数运行 模型。
因此,它会尝试在response.results;
和user1
上找到user2
我需要在模型和集合上使用解析函数,因为模型和集合数据都在结果属性下。
但是如果我获取一个集合,我不希望模型解析函数再次用于单个数组元素。
这个问题有解决方案吗?
我想到了一个解决方案,我的集合解析函数将改变这样的东西:
{
somemetadatas:xxx ,
results:[user1,user2]
}
这样的事情:
[ {results.user1} , {results.user2} ]
这样模型解析函数就不会在集合提取上失败。 但它有点hacky ......这个问题有没有优雅的解决方案?
顺便说一下,由于我的API总会生成此表单的结果,是否可以默认覆盖所有模型和集合的parse
函数? (对不起,我是JS noob ......)
答案 0 :(得分:27)
您可以测试您收到的数据是否由results
成员包装,并做出相应的反应。例如,
var M = Backbone.Model.extend({
parse: function (data) {
if (_.isObject(data.results)) {
return data.results;
} else {
return data;
}
}
});
如果要概括此行为,可以从此基类派生所有模型类,也可以修改Backbone的原型以提供此功能:
Backbone.Model.prototype.parse = function (data) {
if (_.isObject(data.results)) {
return data.results;
} else {
return data;
}
};
答案 1 :(得分:1)
Parse也必须在Collection中实现。
var EgCollection = Backbone.Collection.extend({
parse: function (data) {
if (_.isObject(data.results)) {
return data.results;
} else {
return data;
}
}
});