2017-07-03 40 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