ExtJS MessageBox不会像alert(..)那样阻塞

nue99wik  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(278)

ExtJSMessageBox似乎不像Javascript alert(..)那样阻塞。我想显示一个弹出窗口,然后调用 AJAX 调用,在此之后它将关闭窗口。
如果我像这样调用show方法,那么...

//Alert Box :
var alertBox = Ext.create('Ext.window.MessageBox');
var config = {
    title : 'Title',
    closable: true,
    msg: 'Message',
    buttons: Ext.Msg.OK,
    buttonText: { ok: EML.lang.buttons.ok },
    modal: true
};
alertBox.show(config);

//callback
Ext.Ajax.request({
    url: someURL,
    method: 'POST',
    callback: function (options, success, response) {
        //do some stuff
        self.up('window').destroy();
    }
})

..不显示弹出窗口,但父窗口已关闭。
如果我使用标准的Javascriptalert,则警报将被阻止。单击“确定”按钮后,将执行回调,然后窗口关闭。

//Alert Box :
    alert('asdf')

    //callback
    Ext.Ajax.request({
        url: someURL,
        method: 'POST',
        callback: function (options, success, response) {
            //do some stuff
            self.up('window').destroy();
        }
    })
  • 为什么MessageBox不阻止?
  • 我能做些什么来解决这个问题?
  • MessageBox是否需要知道要阻止的父窗口?
368yc8dk

368yc8dk1#

它不会阻塞,因为自定义javascript代码不支持阻塞。正如chrome控制台告诉我们的,

window.alert
function alert() { [native code] }

并且本机代码可能会阻止执行。
在ExtJS中,您可以为消息框编写一个回调,如下所示:

//Alert Box :
var alertBox = Ext.create('Ext.window.MessageBox');
var config = {
    title : 'Title',
    closable: true,
    msg: 'Message',
    buttons: Ext.Msg.OK,
    buttonText: { ok: EML.lang.buttons.ok },
    modal: true,
    callback:function(btn) {
        //callback
        Ext.Ajax.request({
            url: someURL,
            method: 'POST',
            callback: function (options, success, response) {
                //do some stuff
                self.up('window').destroy();
            }
        })
    }
};
alertBox.show(config);

如果这样的回调是深度嵌套的,我倾向于将回调扁平化,如下所示:

var store = me.down('grid').getStore();
var callback3 = function(btn) {
    if(btn=="yes") store.sync();
};
var callback2 = function() {
    Ext.Msg.prompt('A','Third', callback3);
};
var callback1 = function() {
    Ext.Msg.alert('A','Second', callback2);
};
Ext.Msg.alert('A','First', callback1);

在较新版本的ExtJS中,您可以 checkout Ext.Promise,但在ExtJS 4.1中则不行。

相关问题