2012-03-27 4 views
1

Ich hatte diesen Code vorher arbeiten, aber ich bin jetzt nicht so sicher, dass ich meine HTML-Steuerelemente von meinem jQueryUI Widget getrennt habe.Wie Timeout durch Referenz übergeben? Oder eine bessere Art zu implementieren?

Derzeit startet der Timer korrekt, aber ich verliere meinen Verweis auf _refreshTimeout nach einem Tick. Das heißt, nach dem ersten Häkchen stoppt die Deaktivierung meiner PlanViewRefreshCheckbox nicht die Ausführung meines Timers.

Ich habe zwei JavaScript-Dateien, PlanView.js und PlanViewCanvas.js.

PlanView.js sieht ungefähr so ​​aus:

(function ($) { 
    var _minZoom = -2.0; 
    var _maxZoom = 2.0; 
    var _stepZoom = (_maxZoom - _minZoom)/100; 
    var _refreshTimeout = null; 
    var _refreshInterval = 60000; //One minute 

    $(document).ready(function() { 
     //Initialize Refresh combo box. 
     $('#PlanViewRefreshCheckbox').click(function() { 
      if ($(this).is(':checked')) { 
       var planViewCanvas = $('#PlanViewCanvas'); 
       //Binding forces the scope to stay as 'this' instead of the domWindow (which calls setTimeout). 
       _refreshTimeout = setTimeout(function(){planViewCanvas.PlanViewCanvas('refresh', _refreshInterval, _refreshTimeout)}.bind(planViewCanvas), _refreshInterval) 
      } 
      else { 
       clearTimeout(_refreshTimeout); 
      } 
     }); 
    } 
})(jQuery); 

und PlanViewCanvas.js Häuser ein jQueryUI Widget:

(function ($) { 
    $.widget("ui.PlanViewCanvas", { 
     //other properties and methods not-relevant to problem declared here. 
     refresh: function (refreshInterval, refreshTimeout) { 
      var self = this; 
      _stage.removeChildren(); 
      self.initialize(); 
      //Binding forces the scope to stay as 'this' instead of the domWindow (which calls setTimeout). 
      refreshTimeout = setTimeout(function() { self.refresh(refreshInterval, refreshTimeout) }.bind(self), refreshInterval); 
     }, 
    } 
})(jQuery); 

es scheint, als ob ich über Dinge gehe falsch?

EDIT: Ich denke, die Antwort ist wahrscheinlich setInterval und nicht SetTimeout zu verwenden.

+0

'(dies) .is (': checked')' wäre sehr viel effizienter als einfach 'this.checked'. – RobG

Antwort

0

Die Antwort war sehr "oh derp."

//Initialize Refresh combo box. 
    $('#PlanViewRefreshCheckbox').click(function() { 
     if (this.checked) { 
      _refreshTimeout = setInterval(function(){$('#PlanViewCanvas').PlanViewCanvas('refresh')}, _refreshInterval) 
     } 
     else { 
      clearTimeout(_refreshTimeout); 
     } 
    }); 
0

Das erste Problem ist, dass Sie den Unterstrich

refreshTimeout sollte _refreshTimeout

Sekunde vergessen haben, muss Ihre Variable global sein in beiden Dateien zugänglich sein, so erklären es außerhalb der Funktion:

var _minZoom = -2.0; 
var _maxZoom = 2.0; 
var _stepZoom = (_maxZoom - _minZoom)/100; 
var _refreshTimeout = null; 
var _refreshInterval = 60000; //One minute 

(function ($) { 
    .... 
})(jQuery) 
+0

Ich habe einen Unterstrich nicht vergessen. Ich übergebe die Variable in die Funktion (gerade bei P-B-R fehlgeschlagen). Mein Widget hat keinen Zugriff auf den Bereich, in dem sich _refreshTimeout befindet. Ich hatte gehofft, den globalen Namespace nicht zu verschmutzen, indem ich meine Variable außerhalb meines induzierten Bereichs verschiebe, da mein Widget sich nicht um den Timer kümmert - nur, dass er reagieren muss, indem er aktualisiert wird. –

0

Sie können keine Werte als Verweis übergeben. Ich sehe zwei Optionen:

  • übergeben Sie ein Objekt. Wenn Sie es aus zwei Variablen referenziert haben, können Sie auf seine Eigenschaften in beiden Bereichen zugreifen.
  • teilen Sie die Funktionalität in zwei Funktionen, wo es hingehört: Man meistert die Intervallschleife und löst die Refresh-Funktion, und die andere Dinge zu aktualisieren. Die Variable refreshTimeout gehört nur zum Umfang des ersten. Punkt. Sie können die Intervallfunktion zu Ihrem Widget hinzufügen, wenn es oft benötigt wird.
+0

Ich entschied mich für die Methode setInterval anstelle von setTimeout, da sie zu 100% geeignet war, das von mir eingeführte Problem zu lösen. –

Verwandte Themen