带有backbone.js集合的JSON.stringify()

时间:2012-08-18 23:14:27

标签: backbone.js

有人可以解释一下JSON.stringify()如何神奇地将JSON字符串化为URL提取并且不打扰完整集合对象的其他骨干特定部分吗?

我很好奇底层实现和/或设计模式可以解释这个非常令人印象深刻的功能。我不得不使用json2.js来获得stringify功能,所以我认为主干不会覆盖或装饰stringify。

我发现如果我将一个集合直接传递给JS OBJECT代码,代码“看到”模型键和集合对象的其他主干特定部分,而如果我在该字符串化对象上执行JSON.stringify那么jquery.parseJSON ,我的代码“只看到”URL返回的JSON。

代码:

enter code here

$(function () {
    var Person = Backbone.Model.extend({
        initialize: function () {
            // alert("Model Init");
        }
    }),
    PersonList = Backbone.Collection.extend({
        model: Person,
        url: '/Tfount_Email/Email/SOAInbox',
        initialize: function () {
            // alert("Collections Init");
        }
    }),
    personlist = new PersonList();

    personlist.fetch({
        error: function () {
            alert("Error fetching data");
        },
        success: function () {
            // alert("no error");
        }
    }).complete(function () {

    // first call to makeTable w collection obj, we see MORE than just the JSON returned by URL
        makeTable(personlist);      

    // stringify then parse, we see only JSON returned by URL
        jsonString = JSON.stringify(personlist);
        var plistJSON = jQuery.parseJSON(jsonString);
        makeTable(plistJSON);
    });
});

function makeTable(obj) {

    var type = typeof obj
    if (type == "object") {
        for (var key in obj) {
            alert("key: " + key)
            makeTable(obj[key])
        }
    } else {
        alert(obj)
    }

}

1 个答案:

答案 0 :(得分:11)

这是JSON.Stringify的预期和设计行为。来自Douglas Crockford的JSON2.js文件:

  

当找到对象值时,如果对象包含toJSON方法,则将调用其toJSON方法并将结果进行字符串化。

https://github.com/douglascrockford/JSON-js/blob/master/json2.js#L38-39

当您在Backbone.Collection上调用JSON.stringify时,它会调用该集合的toJSON方法,如此评论所述。