【问题标题】:How to add an object to jQuery ajax beforeSend's settings.data如何在发送 settings.data 之前将对象添加到 jQuery ajax
【发布时间】:2012-07-31 00:15:24
【问题描述】:

我正在绑定到 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,我想使用内置的表单提交器(数据远程)。为什么 settings.data 在上面不起作用?我需要将对象转换为数组还是其他东西?

谢谢

【问题讨论】:

  • 看来我还需要追加数据,而不是替换以不丢失 CSRF 令牌
  • 这个me 变量在哪里定义?在第一个代码 sn-p 中应该是e?我不熟悉 Rails UJS,但beforeSend 回调的正常签名是(jqXHR, settings)。如果我理解正确,您是说您使用submitStuff 作为beforeSend 回调——您或Rails UJS 是否正在做一些调整以拥有额外的参数?

标签: jquery ruby-on-rails ruby-on-rails-3 ujs


【解决方案1】:

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"
}​);​

【讨论】:

    【解决方案2】:

    试试这个

    submitStuff : function(e, xhr, settings) {
    
      settings.data += "&serialized=data";
    
    }
    

    类似帖子:How do I append data to a jquery-ujs post request in Rails?

    【讨论】:

      【解决方案3】:

      为了序列化数据,我会使用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 看到上面的一些简单示例数据的作用。这使您可以轻松地处理数据,并且仅在完成后对其进行序列化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-05
        • 1970-01-01
        • 2021-12-31
        • 2011-04-27
        • 2014-05-25
        • 1970-01-01
        • 2020-01-13
        • 2020-08-20
        相关资源
        最近更新 更多