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.
'(dies) .is (': checked')' wäre sehr viel effizienter als einfach 'this.checked'. – RobG