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

一种方法是使用像 Underscore 的函数pick()。它可用于从对象中挑选您需要的某些属性。无论如何,它是一个有用的库,但如果你愿意,你也可以实现这个简单的方法。

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

总是把东西列入白名单可能是一个好习惯,而不是盲目地发送所有东西。准确指定要发送的内容可以使您免于将来的意外(例如您刚刚遇到的意外)。大多数时候,您根本不想发送存储在对象中的所有内容。

您还可以实现某种方式让您的对象能够返回其可发送内容。它可以得到一个.getJSON()方法,该方法只从对象中收集要发送的所有内容。


关于函数调用:

处理data属性 uses $.param(),在文档中有这个:

从 jQuery 1.3 开始,函数的返回值被用作字符串而不是函数。

这是一个功能,而不是一个错误:)。我理解它背后的逻辑,因为如果您刚刚指定为要发送的数据的对象中有一个函数,那么它背后一定有一个很好的理由......

于 2013-02-21T23:57:17.610 回答
-1

而不是通过data: myObject

尝试设置:var serializedObject = myObject.param()

然后通过data: serializedObject

在这里查看 jQuery 的参数函数。

于 2013-02-21T23:51:36.840 回答