覆盖主干的解析功能

时间:2012-08-13 16:35:20

标签: javascript backbone.js

我试图将Backbone与API一起使用。

默认的API响应格式为:

{
somemetadatas:xxx , 
results:yyy
}

是否为单个模型或集合提取。

据我所知,我可以使用:

覆盖Backbone parse函数
parse: function (response) {
    return response.results;
},

但我在the documentation中看到过:

  

解析 collection.parse(response)

     无论何时,Backbone都会调用

解析   服务器在获取时返回集合的模型。该   函数传递原始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 ......)

2 个答案:

答案 0 :(得分:27)

您可以测试您收到的数据是否由results成员包装,并做出相应的反应。例如,

var M = Backbone.Model.extend({
    parse: function (data) {
        if (_.isObject(data.results)) {
            return data.results;
        } else {
            return data;
        }
    }
});

小提琴http://jsfiddle.net/9rCH3/

如果要概括此行为,可以从此基类派生所有模型类,也可以修改Backbone的原型以提供此功能:

Backbone.Model.prototype.parse = function (data) {
    if (_.isObject(data.results)) {
        return data.results;
    } else {
        return data;
    }
};

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

答案 1 :(得分:1)

Parse也必须在Collection中实现。

var EgCollection = Backbone.Collection.extend({
    parse: function (data) {
       if (_.isObject(data.results)) {
          return data.results;
       } else {
          return data;
       }
    }
});

http://backbonejs.org/#Collection-parse