新手问题 Rails 绑定 ajax:success 无效

xinkiang · 2013年03月30日 · 最后由 lululau 回复于 2013年11月21日 · 3762 次阅读

link_to和form相关的helper加上remote: true选项后,在返回正常的情况下捕捉不到ajax:success事件,但可以捕捉ajax:complete。

这个问题怎么解决呢?

共收到 10 条回复

你返回的数据格式是什么?你返回json试下

绑定 error,console.log 一下 data。

你要看一下HTML的源码,确定有 data-remote=true 属性

#1楼 @guyanbiao 是返回json数据 #2楼 @Rei 能触发ajax:error,但event和status对象貌似都正常

Object {readyState: 4, getResponseHeader: function, getAllResponseHeaders: function, setRequestHeader: function, overrideMimeType: function}
abort: function ( statusText ) {
always: function () {
complete: function () {
done: function () {
error: function () {
fail: function () {
getAllResponseHeaders: function () {
getResponseHeader: function ( key ) {
overrideMimeType: function ( type ) {
pipe: function ( /* fnDone, fnFail, fnProgress */ ) {
progress: function () {
promise: function ( obj ) {
readyState: 4
responseText: "{"succeed":true}"
setRequestHeader: function ( name, value ) {
state: function () {
status: 200
statusCode: function ( map ) {
statusText: "OK"
success: function () {
then: function ( /* fnDone, fnFail, fnProgress */ ) {
__proto__: Object

可以通过绑定ajax:complete来实现ajax:success

$dom.on('ajax:complete',function(ex,e){
      if(e.status == 200 && $.parseJSON(e.responseText).succeed){
        //do something
      }else{
        alert("failed");
      }
});

#3楼 @edokeh 嗯,是有的

你可以在 Chrome 里面抓个包看一下 HTTP 的返回是什么 另外我好像记得还要加个 data-json=true 才能是用 JSON 格式交互

贴处理请求的action 代码

#4楼 @xinkiang 触发 error 回调就是有哪里出错了,或者和 rails_ujs 的约定不合,比如 #5 说的 json

...

https://github.com/rails/jquery-ujs/wiki/Unobtrusive-scripting-support-for-jQuery#data-type-set-ajax-request-type-for-data-remote-requests

恩,LS说得对,我那个记错了,应该是 data-type="json"

@Rei @edokeh 正解,感谢楼上各位!

挖个坟,因为我也遇到这个问题,总结一下:

  1. 如果 server 返回的是 plain text,那么 data-type 一定要设置为 text
  2. 如果 server 返回的是 JSON,那么 data-type 一定要设置为 json (当然这种情况你设成 text 也可以的啦,只不过 rails_ujs 不会帮你解析 JSON 啦)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册