ExtJS MessageBox 不像 alert(..) 那样阻塞
ExtJS MessageBox does not block like alert(..) does
ExtJS MessageBox 似乎不像 Javascript alert(..) 那样阻塞。我想显示一个弹出窗口,然后调用 AJAX 调用,然后关闭 window。
如果我这样调用 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();
}
})
..未显示弹出窗口,但父级 window 已关闭。
如果我使用标准 Javascript alert 则警报将被阻止。单击确定按钮后,将执行回调,然后 window 关闭。
//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 是否需要以某种方式了解要阻止的父 window?
它不会阻止,因为自定义 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 中,您可以查看 Ext.Promise
,但不能在 ExtJS 4.1 中查看。
ExtJS MessageBox 似乎不像 Javascript alert(..) 那样阻塞。我想显示一个弹出窗口,然后调用 AJAX 调用,然后关闭 window。
如果我这样调用 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();
}
})
..未显示弹出窗口,但父级 window 已关闭。
如果我使用标准 Javascript alert 则警报将被阻止。单击确定按钮后,将执行回调,然后 window 关闭。
//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 是否需要以某种方式了解要阻止的父 window?
它不会阻止,因为自定义 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 中,您可以查看 Ext.Promise
,但不能在 ExtJS 4.1 中查看。