3

jQuery.ajax() がデータ オブジェクト関数を呼び出しているという問題があります。たとえば、次のようなオブジェクト構造があります。

var TestFactory = (function () {
    var _id;
    var _attributes;

    return {
        createObject: function (objectId) {
            var value = null;
            _id = objectId;
            _attributes = {};

            function _showErrorStatus() {
                $('label')
                    .css('background-color', 'red')
                    .css('color', 'black')
                    .text('jQuery called me...');
            }

            function _attr(key, value) {
                if (value == null) {
                    return _attributes[key];
                }

                _attributes[key] = value;

                return this;
            }

            return {
                id: _id,
                attributes: _attributes,
                showErrorStatus: _showErrorStatus,
                attr: _attr,                
            }
        }
    }
})();

次のように、このオブジェクトを jQuery.ajax() 呼び出しのデータ値として使用したいと思います。

var myObject = TestFactory.createObject(12345);

myObject.attr('name', 'Fred Flinstone');

$.ajax({
    url: '/echo/json/',
    type: 'GET',
    data: myObject,
    dataType: 'json',
});

私が直面している問題は、ファクトリによって返されたオブジェクトから jQuery.ajax() が showErrorStatus() 関数を呼び出していることです。コードのどこにもこの関数を呼び出していません。

私はこのオブジェクトを使用することで得られる OOP の品質が気に入っています。大幅に書き直さずにこのケースを処理する方法はありますか (たとえば、「クラス」からすべての機能を削除するなど)。

注:この問題を説明するのは難しいので、ここに jsfiddle での完全な実行例を示します。

4

4 に答える 4

2

私の知る限りでは文書化されていませんが、それは機能であるために発生します。

オブジェクトを渡すと、オブジェクトプロパティの値である関数を呼び出す必要があると想定されます。

于 2013-02-21T23:54:12.200 に答える
2

JSON.stringify(jQuery メソッドではありません)を使用します。

$.ajax({
    url: '/echo/json/',
    type: 'GET',
    data: JSON.stringify(myObject),
    dataType: 'json',
});

http://jsfiddle.net/HJ9AS/10/

于 2013-02-21T23:56:11.383 に答える
1

これを行う 1 つの方法は、Underscore の のような関数を使用することですpick()。オブジェクトから必要な特定のプロパティを厳選するために使用できます。とにかく便利なライブラリですが、必要に応じてこの単純なメソッドを実装することもできます。

$.ajax({
    url: '/echo/json/',
    type: 'GET',
    /* only send id and attributes! */
    data: _.pick(myObject, 'id', 'attributes'),
    dataType: 'json',
});

すべてをやみくもに送信するのではなく、常に何かをホワイトリストに登録するのは良い習慣かもしれません。何を送信するかを正確に指定することで、将来の驚きからあなたを救うことができます (あなたが遭遇したようなもの)。ほとんどの場合、オブジェクトに格納されているすべてのものを送信したくないだけです。

オブジェクトが送信可能なコンテンツを返すことができるようにする方法を実装することもできます。.getJSON()オブジェクトから送信されるすべてのものを収集するだけのメソッドを取得できます。


関数呼び出しに関して:

dataプロパティの処理にはが使用されます$.param()。これはドキュメントに次のように記載されています。

jQuery 1.3 の時点で、関数の戻り値は、文字列としての関数の代わりに使用されます。

これは機能であり、バグではありません:)。送信するデータとして指定したオブジェクトに関数がある場合、その背後には正当な理由があるはずなので、その背後にあるロジックを理解しています...

于 2013-02-21T23:57:17.610 に答える
-1

を渡す代わりにdata: myObject

これを設定してみてください:var serializedObject = myObject.param()

その後通過data: serializedObject

ここでjQuery の param 関数を確認してください。

于 2013-02-21T23:51:36.840 に答える