如何将一个对象添加到jQuery ajax beforeSend的settings.data中

4
我将绑定到beforeSend的ajax表单提交:
我的函数如下:
submitStuff : function(e, xhr, settings) {

    settings.data = {
            invitation : {
                emails : me.returnsArrayX(),
                bucket2 : me.returnsArrayY(),
                bucket3 : me.returnsArrayZ()
            }
    }

}

当我手动向服务器提交时,它是可以工作的,就像这样:
    $.ajax({
        type: 'POST',
        url: '/myurl',
        dataType: 'json',
        data: {
            invitation : {
                emails : me.returnsArrayX(),
                bucket2 : me.returnsArrayY(),
                bucket3 : me.returnsArrayZ()
            }
        }
    });

但由于我正在使用Rails UJS,我想使用内置的表单提交器(data-remote)。为什么在上述情况下settings.data不起作用?我需要将对象转换为数组或其他吗?

谢谢。


看起来我还需要追加数据,而不是替换,以免丢失CSRF令牌。 - AnApprentice
1
这个 me 变量定义在哪里?第一个代码片段中应该是 e 吗?我不熟悉 Rails UJS,但是 beforeSend 回调的正常签名是 (jqXHR, settings)。如果我理解你正确,你是说你正在使用 submitStuff 作为 beforeSend 回调--是你还是Rails UJS对此进行了一些调整,以增加额外的参数? - JMM
3个回答

3
processData设置为false,然后您可以在beforeSend中轻松使用一个对象:
$.ajax("/", {
    beforeSend: function(xhr, settings) {
        settings.data.key2 = "value2";
        settings.data.key3 = {
             more: "values",
             like: "this"
        }; 

        //Encode at end
        settings.data = jQuery.param(settings.data, false);
    },
    data: {
        key: "value"
    },
    processData: false,
    type: "POST"
}​);​

1

对于序列化数据,我会使用jQuery.param(obj)。因此,根据pdpMathi的示例,它应该看起来像这样。

submitStuff : function(e, xhr, settings) {

    data = {
            invitation : {
                emails : me.returnsArrayX(),
                bucket2 : me.returnsArrayY(),
                bucket3 : me.returnsArrayZ()
            }
    }
    settings.data += "&serialized=" + jQuery.param(data)

}

您可以在这里jsFiddle查看上述代码对一些简单示例数据的操作。这使您能够轻松处理数据,并在完成时仅对其进行序列化。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接