Почему Ext.MessageBox застревает после нескольких нажатий на кнопку «ОК»? - PullRequest
1 голос
/ 06 апреля 2020

Я использую MessageBox из Ex JS Framework, чтобы показать диалог с кнопкой «ОК».

// app.js
function showNoteMessage (title, message, fn, scope) {
    return Ext.Msg.show({
        title: 'Title example',
        message: 'Message text',
        buttons: Ext.MessageBox.OKCANCEL,
        promptConfig: false,
        fn: function () {
            if (fn) {
                fn.apply(scope, arguments);
            }
        },
        scope: scope
    });
}

// index.html
<button onclick="showNoteMessage()">Open dialog several times</button>

Шаги для воспроизведения:

  1. Открыть диалог с помощью двух кнопок » Ok "и" Cancel ".
  2. Нажмите кнопку" Ok "
  3. Еще раз откройте диалоговое окно.
  4. При нажатии кнопки" Ok "еще раз, диалоговое окно застревает на экране и разблокирует весь его контент. Кнопки внутри диалогового окна отключены.

Текущая версия Ext. js 2.4.2.571.

После нажатия на Кнопка «ОК» или «Отмена», серый фон исчезает, и диалог застревает с разблокировкой контента под ним. Я пытаюсь обернуть Ext.Msg.show в setTimeout, но похоже, что он работает только локально.

Обновление

Я продолжаю работать над этой ошибкой и обнаружил, что проблема может быть в этой функции:

// MessageBox.js

...
onClick: function(button) {
    if (button) {
        var config = button.config.userConfig || {},
            initialConfig = button.getInitialConfig(),
            prompt = this.getPrompt();

        if (typeof config.fn == 'function') {
            button.disable();
            this.on({
                hiddenchange: function() {
                    config.fn.call(
                        config.scope || null,
                        initialConfig.itemId || initialConfig.text,
                        prompt ? prompt.getValue() : null,
                        config
                    );
                    button.enable();
                },
                single: true,
                scope: this
            });
        }
    }

    this.hide();
},
...

По какой-то причине при шаге со сломанным щелчком пропускается эта часть кода:

            this.on({
                hiddenchange: function() {
                    config.fn.call(
                        config.scope || null,
                        initialConfig.itemId || initialConfig.text,
                        prompt ? prompt.getValue() : null,
                        config
                    );
                    button.enable();
                },
                single: true,
                scope: this
            });

1 Ответ

1 голос
/ 14 апреля 2020

Проблема была связана со старой версией Ext JS. Я не смог обновить его, поэтому нашел обходной путь: отключить анимацию следующим образом:

 // app.js
 ...
 Ext.Msg.defaultAllowedConfig.showAnimation = false;
 Ext.Msg.defaultAllowedConfig.hideAnimation = false;  
 ...
...