2014-02-24 74 views
1

我正在嘗試使用ajax來展開和摺疊每一行的選項。如何使用link_to跟蹤ajax調用:remote => true

我正在使用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 

非常感謝!

+2

你可以嘗試通過添加一個onclick處理程序:'if(ajax){ajax.abort();}'?看看這個也http://stackoverflow.com/questions/8878115/how-to-stop-previous-ajax-call-sent-in-jquery – MrYoshiji

+1

我不認爲你真的需要擔心這個:當你擴展一行,你使用ajax來填充它,但在那之後,你只會崩潰並正常擴展它,不是嗎?也就是說,您只需要每行執行一次ajax加載:當擴展時,您可以查看該行中是否有任何內容,如果它是空的,請執行ajax調用,如果它被填充,則只顯示內容。 –

+0

感謝您的幫助,但在螢火蟲上,我看到所有的呼叫加載,我不想創造額外的流量需要,表格會很長,也許每個電話會檢索大量的記錄。我只想不加載重複的呼叫,或者如果用戶摺疊了,然後停止當前的呼叫。 – Alejandra

回答

1

正如你從收集到的意見,你可以用ajax abort取消當前的請求,不過,我覺得有必要寫一個答案


jQuery的ujs.js

我強烈推薦而不是更改JQuery-ujs文件(除非您計劃向Rails回購提交要點),主要用於兼容性目的。這是Rails的資產流水線的核心組成部分,並會只是一個痛苦的不斷更新,以保持符合Rails的更新

相反,我會建議使用Ajax global settings & 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依賴關係:)

+1

是的,我的TL對我也一樣,我正在使用ajax調用自己的應用程序.js文件。erb和我用這個問題的代碼(http://stackoverflow.com/questions/18775455/ajax-prevent-multiple-request-on-click)在通話期間禁用擴展鏈接的功能。我認爲你的想法更有效率,以殺死正在進行的和不需要的呼叫(當呼叫完成之前有人崩潰)非常感謝你的幫助:) – Alejandra

相關問題