[英]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',
});
一種方法是使用像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.