Ich verwende die Unobtrusive JavaScript solution for polling in a Rails application, die eine gute Lösung zu sein scheint, obwohl ich Schwierigkeiten habe, die .stop()
-Methode von einer .js.erb
Ansicht aufrufen. Ich möchte die Abfrage abbrechen können, wenn ein Inline-Bearbeitungsformular für eines der Elemente geöffnet ist, die durch Abfragen aktualisiert werden. Ich nenne .stop()
aus der edit.js.erb Ansicht gerendert wird, aber es Polling hält ...Rufen Sie JavaScript-Konstruktormethode aus einer anderen Datei - 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();
// });
...
Wie Ich verstehe es, das Problem ist @intervalId
ist undefiniert.
Ist das auf dem richtigen Weg?
Irgendwelche Vorschläge, wie man diese Arbeit macht, würde sehr geschätzt werden.
Danke!
Vielen Dank für Ihren Vorschlag! Das ist ein guter Vorschlag, aber ich wollte nicht alle gestarteten 'Poller'-Objekte durchlaufen und sie stoppen. Ich möchte nur einen bestimmten "Poller" stoppen können. Hättest du Vorschläge, wie man einen bestimmten "Poller" im Array anvisiert? Danke noch einmal! – slehmann36
Wenn Sie jedem div eine spezifische ID hinzufügen könnten. Es wäre möglich. Bis dahin ist es schwierig das Ziel zu stoppen. Selbst wenn Sie eine eindeutige Dummy-Klasse hinzufügen können, würde es funktionieren. Lass es mich wissen, wenn das möglich ist und ich werde meine Antwort aktualisieren. –
Ja, ich kann eine ID hinzufügen .. – slehmann36