覆盖主干的解析功能

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;user1user2

我需要模型和集合上的解析函数,因为模型和集合数据都在结果属性下.

但是如果我获取集合,我不希望模型解析函数再次用于单个数组元素.


那么这个问题有解决方案吗?

我想到了一个解决方案,我的集合解析函数将转换为这样的东西:

{
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)

http://jsfiddle.net/9rCH3/1/