Как передать тайм-аут по ссылке? Или лучший способ реализовать? - PullRequest
1 голос
/ 28 марта 2012

Раньше этот код работал, но теперь я не уверен, что отделил свои HTML-элементы управления от своего виджета jQueryUI.

В настоящее время таймер запускается правильно, но я теряю ссылку на _refreshTimeout после того, какодин тикТо есть, после первой отметки, снятие отметки с моего PlanViewRefreshCheckbox не останавливает работу моего таймера.

У меня есть два файла JavaScript, PlanView.js и PlanViewCanvas.js.

PlanView.js выглядит примерно так:

(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);

, а PlanViewCanvas.js содержит jQueryUIВиджет:

(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);

Кажется ли, что я поступаю неправильно?

РЕДАКТИРОВАТЬ: Я думаю, что ответ, вероятно, использовать setInterval, а не setTimeout.

Ответы [ 3 ]

0 голосов
/ 28 марта 2012

Ответ был очень «о, сумасшедший».

    //Initialize Refresh combo box.
    $('#PlanViewRefreshCheckbox').click(function () {
        if (this.checked) {
            _refreshTimeout = setInterval(function(){$('#PlanViewCanvas').PlanViewCanvas('refresh')}, _refreshInterval)
        }
        else {
            clearTimeout(_refreshTimeout);
        }
    });
0 голосов
/ 28 марта 2012

Вы не можете передавать значения по ссылке.Я вижу два варианта:

  • передать объект.Если у вас есть ссылка на него из двух переменных, вы можете получить доступ к его свойствам в обеих областях.
  • разделите вашу функциональность на две функции, которым она принадлежит: одна управляет циклом интервала и запускает функцию обновления, а другая -делает вещи, чтобы освежить.Переменная refreshTimeout относится только к области действия первой.точка.Вы можете добавить функцию интервала к вашему виджету, если это часто необходимо.
0 голосов
/ 28 марта 2012

Первая проблема заключается в том, что вы забыли, что подчеркивание

refreshTimeout должно быть _refreshTimeout

секунда, ваша переменная должна быть глобальной, чтобы она была доступна в обоих файлах, поэтому объявите еевне функции:

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

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