2017-07-03 42 views
0

我使用的是Unobtrusive JavaScript solution for polling in a Rails application,這似乎是一個很好的解決方案,但我無法從.js.erb視圖調用.stop()方法。我希望能夠在通過輪詢刷新其中一個項目時打開內聯編輯表單時停止輪詢。我打電話從edit.js.erb視圖.stop()呈現,但它一直輪詢...從不同的文件調用JavaScript構造方法 - Rails

unobtrusive_poller.coffee:

class Poller 

    constructor: (@div) -> 

    interval: -> 
    $(@div).data("interval") ? 3000 

    url: -> 
    $(@div).data("url") 

    start: -> 
    console.log "Starting polling" 
    @intervalId = setInterval(@request, @interval()) 

    request: => 
    # console.log "Interval: #{@interval()}" 
    # console.log "URL: #{@url()}" 
    console.log "Polling" 
    $.ajax(
     url: @url(), 
     dataType: "script").fail (data) => 
     console.log "Poll failed!" # + JSON.stringify(data) 
     return 

    stop: -> 
    console.log "Stopping polling" 
    clearInterval(@intervalId) 

$(document).on 'turbolinks:load', -> 
    $("div[data-poll='true']").each (i, div) -> 
    console.log "DIV: " + div 
    new Poller(div).start() 

edit.js.erb:

// Pause polling while edit form is open 
console.log($('div#messages[data-poll='true']')); 
new Poller($('div#messages[data-poll='true']')).stop(); 

// $("div[data-poll='true']").each(function(i, div) { 
// console.log("DIV: " + div); 
// return new Poller(div).stop(); 
// }); 

... 

由於我明白了,問題是@intervalId是未定義的。

這是正確的軌道嗎?

任何有關如何使這項工作的建議將不勝感激。

謝謝!

回答

2

您將需要存儲您正在初始化輪詢事件的每個div的對象。您每次都在創建新對象,但不會將其存儲在任何地方。您需要將它存儲在某處,以便稍後可以在創建的對象上調用stop。

更新:保存ID在哈希

此代碼創建一個HashMap來存儲所有你要綁定

window.pollHash = {} 

$(document).on 'turbolinks:load', -> 
    $("div[data-poll='true']").each (i, div) -> 
    console.log "DIV: " + div 
    id = $(div).attr("id") 
    pollObject = new Poller(div) 
    pollObject.start() 
    window.pollHash[id] = pollObject 

並在edit.js.erb投票活動,你是使用new運算符再次創建新對象。您應如上所述使用已存儲的對象,然後按如下所示調用stop方法。

targetDiv = $('div#messages[data-poll='true']') 
//Not sure about your target condition, replace 
// above selector as your target as per your need. 
targetId = $(targetDiv).attr("id") 
window.pollHash[targetId].stop() 

希望它有幫助!

+0

感謝您的建議!這是一個很好的建議,但我不想遍歷所有已啓動的'Poller'對象並停止它們。我只是想停止一個特定的「輪詢」。你有什麼建議如何針對數組中的特定「輪詢」?再次感謝! – slehmann36

+0

如果你可以添加一個特定的ID給每個div。這將是可能的。直到那時很難停止目標股利。即使你可以附加一個虛擬的獨特類,它也可以工作。讓我知道如果這是可能的,我會更新我的答案。 –

+0

是的,我可以添加一個ID .. – slehmann36