簡體   English   中英

為什么jQuery.ajax()調用我的對象函數?

[英]Why is jQuery.ajax() Calling my Objects Functions?

我遇到一個問題,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的完整運行示例

這是因為它是一個功能,盡管我沒有記錄。

如果傳遞一個對象,則它假定您希望它調用任何屬於對象屬性值的函數。

使用JSON.stringify (不是jQuery方法)。

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

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

一種方法是使用像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開始,使用函數的返回值而不是函數作為String。

這是一個功能,而不是一個bug :)。 我理解它背后的邏輯,因為如果對象中有一個函數你剛才指定為要發送的數據,那么它背后必然有一個很好的理由......

而不是傳遞data: myObject

嘗試設置: var serializedObject = myObject.param()

然后傳遞data: serializedObject

在這里查看jQuery的param函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM