Есть ли способ вырваться из рекурсии событий в JQuery без использования глобальной переменной? - PullRequest
2 голосов
/ 16 октября 2010

У меня есть форма с 2 текстовыми вводами и 2 контролами диапазона.Обычно, когда текстовое поле A изменяется, вызывается событие для изменения диапазона A, а когда текстовое поле B изменяется, событие запускается для изменения диапазона B.

Однако в одном конкретном случае я хотел бы изменить либотекстовое поле A или текстовое поле B для обновления обоих диапазонов A и B. В этом случае я попытался связать события с соответствующими элементами управления, но это не сработало, потому что в коде построения событий настроено много состояний (неупомяните, что каждое событие вызывает 'this', что заставило бы логику использовать неправильный элемент управления, если бы он был запущен не так, как предполагалось).

Чтобы упростить задачу, было бы лучше передать строку(представляющий другой идентификатор ввода текста) обработчику событий во время его создания, а затем вызов события change () вручную для второго элемента управления.Однако это помещает вещи в бесконечный цикл рекурсии.Я думал о способе обойти рекурсию, но она требует глобальной переменной.

Есть ли лучший способ, чем этот, предпочтительно тот, который не требует глобальной переменной?

ml_inEvent = false;



   $ctlToVal.bind('keyup change', {feedbackCtl: ml_feedback, controlsToMonitor: ary, validationGroup: this.validationGroup, controlToFire: ctlToFire}, function(event) {
        // Other processing happens here...

        if (event.data.controlToFire != '') {
            var $controlToFire = $('#' + event.data.controlToFire);
            if ($controlToFire.length) {
                // Use a global variable to ensure this event is not fired again
                // as a result of calling the other one
                if (!ml_inEvent) {
                    ml_inEvent = true;
                    $controlToFire.change();
                    ml_inEvent = false;
                }
            }
        }
    });

1 Ответ

3 голосов
/ 16 октября 2010

Вы можете использовать аргумент extraParameters на .trigger(), чтобы прорваться, например:

$ctlToVal.bind('keyup change', {feedbackCtl: ml_feedback, controlsToMonitor: ary, validationGroup: this.validationGroup, controlToFire: ctlToFire}, function(event, fire) {
  // Other processing happens here...
  if(fire !== false)  $('#' + event.data.controlToFire).trigger('change', false);
});

Вы можете попробовать здесь .Это то, что обратный вызов обработчика событий получает не только event объект , но также любые другие аргументы, которые вы передаете, в этом случае мы просто используем простой falseи !=== отметьте это как важное, чтобы undefined (параметр вообще не передавался) по-прежнему изменяет оба элемента управления.Так, например, $("#control").change() изменит оба элемента управления, но все еще не зацикливается ... вы можете проверить это здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...