我遇到的问题是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特性,所以有没有办法处理这种情况而没有重大改写(例如,从“类”中删除所有功能)?
注意:我发现很难解释这个问题,所以这里有一个完整的example on jsfiddle。
答案 0 :(得分:2)
之所以发生这种情况,是因为它是一个功能,尽管我没有记录。
如果传递一个对象,则它假定您希望它调用任何对象属性值的函数。
答案 1 :(得分:2)
使用JSON.stringify
(不是jQuery方法)。
$.ajax({
url: '/echo/json/',
type: 'GET',
data: JSON.stringify(myObject),
dataType: 'json',
});
答案 2 :(得分: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开始,使用函数的返回值而不是函数作为String。
这是一个功能,而不是一个bug :)。我理解它背后的逻辑,因为如果对象中有一个函数你刚刚指定为要发送的数据,那么它背后必然有一个很好的理由......
答案 3 :(得分:-1)
而不是传递data: myObject
,
尝试设置:var serializedObject = myObject.param()
然后传递data: serializedObject
查看jQuery的param函数here。