如何使用link_to跟踪ajax调用:remote =>真正

时间:2014-02-24 15:19:02

标签: javascript jquery ruby-on-rails ajax

我正在尝试实现一个表,其中包含使用ajax展开和折叠每一行的选项。

我正在使用link_to :remote => true并且工作正常,问题是当我多次点击时,所有呼叫都保持活跃状态​​。我想知道如何跟踪这些电话并在用户崩溃或请求新电话时将其丢弃。由于我没有让$ .ajax打电话给我自己,我不知道怎么做。

这是我的代码。

index.html.haml

%tr{ :class => 'cmp_row'}
          %td
            = link_to "+", user_company_details_path(company_id), :remote => true , :method => :post, :cache => false, :class => "cmp_exp_link", :id => "#{company_id}

application.js.erb

$('.cmp_exp_link').click(function (e) {
  var cmp_id = e.target.id
  if($(this).text() === "+"){
    $("<tr id='details_row_"+cmp_id+"'><td colspan = 11 id='details_cell_"+cmp_id+"' style='text-align:center' > </td> </tr>").insertAfter($(this).closest(".cmp_row"));
    $("#details_cell_"+cmp_id).html("<img src='/assets/colorbox/loading.gif' >")
    $(this).text("-");

  }else{
    $(this).text("+");
    $("#details_row_"+cmp_id).remove();
    return false;
  }
});

company_details.js.erb

// remove the loading icon
$("#details_cell_<%= params[:cmp_id] %>").html("");

// load partial
$("#details_cell_<%= params[:cmp_id] %>").html("<%= escape_javascript(render(:partial => "company_details", :locals => { :results => @results })) %>");

user_controller.rb

def company_details

    @results = @data
    respond_with(@results)

  end

提前多多感谢!!

1 个答案:

答案 0 :(得分:1)

正如您从评论中收集的那样,您可以使用ajax abort取消当前请求,但是,我觉得有必要写一个答案


<强> JQuery的-ujs.js

我强烈建议更改JQuery-ujs文件(除非您计划向Rails repo提交要点),主要是出于兼容性目的。它是Rails资产管道的核心组件,只是为了保持更新以与Rails更新保持一致而感到痛苦

相反,我建议使用Ajax global settings&amp; manually stopping previous calls

#app/assets/javascripts/application.js
$(document).on("click", "#table_row", function() {
    $.ajax({ 
        url: $(this).attr("your-link-attr"),
        data: $(this).attr("data-something"),
        success: function(data) {
            //Returned Data
        }
    })
});

$(document).ready(
    var xhr;

    var fn = function(){
        if(xhr && xhr.readyState != 4){
            xhr.abort();
        }
        xhr = $.ajax({
            url: 'ajax/progress.ftl',
            success: function(data) {
                //do something
            }
        });
    };

    var interval = setInterval(fn, 500);
);

这可能有效,也可能不行,但我推荐它自定义核心Rails依赖项:)