使用collection.reset不会触发集合的解析方法

时间:2014-03-16 02:47:45

标签: javascript json backbone.js

我正在使用Backbone集合的重置方法在页面加载时将一堆JSON数据直接引导到集合中。

文档提供了一些可能是这种情况的线索,但是当我这样做时,不会触发Collection或Models的解析方法。哪个真烦人。

以下是一些示例代码:

var ablefutures = {};

ablefutures.category = Backbone.Model.extend({
    idAttribute : 'categoryId',

    parse : function(response)
    {
        debugger;
        response.categoryDetailItems = new ablefutures.categoryDetailItems(response.categoryDetailItems);

        return response;
    }
});


ablefutures.categories = Backbone.Collection.extend({

    model: ablefutures.category,
    url: '../api/categoriesRouter.php',
    parse : function(response)
    {
        debugger;

        return response
    }
});

categories = new ablefutures.categories();

categories.reset([{"categoryId":1,"name":"Eyewear","heroText":"<div>The complete <span class=\"stand-out\">eyewear<\/span> solution<\/div><div class=\"subText\">Eye protection for clinicians and patients.<\/div>","categoryDetailItems":[{"categoryDetailId":1,"description":"gdfsgdfgdfgdfgdf"}],"created":null,"lastUpdated":null,"status":1}]);

category = categories.get(1);

$('#category').html(category.get('categoryId'));

见下面的小提琴: http://jsfiddle.net/JonRed/zW68M/2/

我希望这两个'调试器'语句都会被命中,但正如你所看到的,两者都没有。 该文档指出'解析'仅在集合的fetch方法上触发,但这将涉及第二个ajax调用,我根本不需要。

任何人都可以建议我可以使用一种技术来获取集合的重置方法来解析解析方法吗?

谢谢,

1 个答案:

答案 0 :(得分:4)

Collection#reset需要第二个options参数。文档没有提及,但您可以通过parse: true中的optionsreset致电parse

categories.reset([...], { parse: true });

最小演示:http://jsfiddle.net/ambiguous/2BJdq/
更新小提琴的版本:http://jsfiddle.net/ambiguous/whb7m/

reset最终要求Collection#set执行大部分繁重的工作,并在调用options时通过setset除了您can see it in the code之外,parse: true并未记录set: function(models, options) { //... if (options.parse) models = this.parse(models, options); 行为:

parse: true

说实话,我根据API的其他部分猜测,选项中的{{1}}可能会起作用并尝试过,然后我通过跟踪文档和源代码找到了理由。