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

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

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

这个问题怎么解决呢?

你返回的数据格式是什么?你返回 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 啦)
需要 登录 后方可回复, 如果你还没有账号请 注册新账号