4

JSON.stringify() が魔法のように URL によってフェッチされた JSON のみを文字列化し、完全なコレクション オブジェクトの他のバックボーン固有の部分を気にしない方法を誰かが説明できますか?

この非常に印象的な機能を説明する基本的な実装および/または設計パターンに興味があります。stringify 機能を取得するには json2.js を使用する必要があったため、バックボーンが stringify をオーバーライドまたは装飾しているとは思いません。

コレクションを JS OBJECT コードに直接渡すと、コードはコレクション オブジェクトのモデル キーやその他のバックボーン固有の部分を「認識」しますが、その文字列化されたオブジェクトに対して JSON.stringify THEN 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)
    }

}
4

1 に答える 1

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、このコメントで説明されているように、そのコレクションのメソッドが呼び出されます。

于 2012-08-19T00:23:03.323 に答える