繁体   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