重写骨干解析功能(Overriding backbone's parse function)

2019-06-27 00:13发布

我试图用骨干与API。

默认的API响应格式为:

{
somemetadatas:xxx , 
results:yyy
}

无论是获取单个模型或集合。

所以,据我知道我可以重写骨干parse函数:

parse: function (response) {
    return response.results;
},

但我见过的文档 :

解析 collection.parse(response)

解析由骨干每当集合的模型是由服务器返回,在获取调用。 所述函数传递原始response对象,应该返回模型的阵列属性被添加到集合。 默认的实现是一个空操作,只需通过JSON响应。 如果你需要与现有的API来工作,或者更好的命名空间,你的反应覆盖。 请注意,以后,如果你的模型类已经有一个parse函数,它将对每个取模型上运行。

所以,如果我有一个集合的响应取这样的:

{
somemetadatas:xxx , 
results:[user1,user2]
}

第一个parse的采集功能会提取[user1,user2]

但医生说:

请注意,以后,如果你的模型类已经有一个parse函数,它将对每个取模型上运行。

所以它会尝试找到response.results;user1user2

我需要在模型和收藏两种解析功能,因为这两个模型和收集DATAS将结果属性下。

但是,如果我在收集获取,我不想againt单个数组元素中使用的模型解析功能。


那么,有没有对这个问题的解决方案?

我认为一个解决方案,我的收藏解析功能将改变像这样的:

{
somemetadatas:xxx , 
results:[user1,user2]
}

弄成这个样子:

[ {results.user1} , {results.user2} ]

因此,该模型的解析功能将无法在集合失败抓取。 但它是一个有点哈克...是否有任何优雅的解决这个问题呢?


顺便说一句,我的API总是会产生这种形式的结果,是有可能在默认情况下,以覆盖parse我的所有车型和收藏的功能? (对不起,我一个JS小白......)

Answer 1:

如果您收到的数据由包裹你可以测试results成员并作出相应反应。 例如,

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

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

如果要概括这种行为,无论是从这个基类派生的所有模型类或修改骨干的原型来提供这个功能:

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

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



Answer 2:

分析还必须在集合来实现。

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

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



文章来源: Overriding backbone's parse function