Seb*_*ber 21 javascript backbone.js
我正在尝试使用Backbone和API.
默认的API响应格式为:
{
somemetadatas:xxx ,
results:yyy
}
Run Code Online (Sandbox Code Playgroud)
无论是单个模型还是集合的获取.
据我所知,我可以用以下方式覆盖Backbone parse
功能:
parse: function (response) {
return response.results;
},
Run Code Online (Sandbox Code Playgroud)
但我在文档中看到:
解析
collection.parse(response)
只要服务器在fetch中返回集合的模型,Backbone就会调用parse.该函数传递给原始
response
对象,并应返回要添加到集合中的模型属性数组.默认实现是无操作,只是通过JSON响应.如果您需要使用预先存在的API,或者更好地命名您的响应,请覆盖此项.请注意,之后,如果您的模型类已经有一个parse
函数,它将针对每个获取的模型运行.
所以,如果我对这样的集合提取有响应:
{
somemetadatas:xxx ,
results:[user1,user2]
}
Run Code Online (Sandbox Code Playgroud)
parse
集合中的第一个函数将被提取[user1,user2]
.
但是医生说:
请注意,之后,如果您的模型类已经有一个
parse
函数,它将针对每个获取的模型运行.
所以它会试图找到response.results;
在user1
和user2
我需要模型和集合上的解析函数,因为模型和集合数据都在结果属性下.
但是如果我获取集合,我不希望模型解析函数再次用于单个数组元素.
那么这个问题有解决方案吗?
我想到了一个解决方案,我的集合解析函数将转换为这样的东西:
{
somemetadatas:xxx ,
results:[user1,user2]
}
Run Code Online (Sandbox Code Playgroud)
进入这样的事情:
[ {results.user1} , {results.user2} ]
Run Code Online (Sandbox Code Playgroud)
这样模型解析函数就不会在集合提取上失败.但它有点hacky ......这个问题有没有优雅的解决方案?
顺便说一句,因为我的API总是会生成这个表单的结果,所以我可以默认覆盖parse
所有模型和集合的功能吗?(对不起,我是JS菜鸟......)
nik*_*shr 28
您可以测试您收到的数据是否由results
成员包装并做出相应的反应.例如,
var M = Backbone.Model.extend({
parse: function (data) {
if (_.isObject(data.results)) {
return data.results;
} else {
return data;
}
}
});
Run Code Online (Sandbox Code Playgroud)
还有一个小提琴http://jsfiddle.net/9rCH3/
如果要概括此行为,可以从此基类派生所有模型类,也可以修改Backbone的原型以提供此功能:
Backbone.Model.prototype.parse = function (data) {
if (_.isObject(data.results)) {
return data.results;
} else {
return data;
}
};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
25078 次 |
最近记录: |