2017-02-23 3 views
2

ExtJS MessageBox scheint nicht zu blockieren, wie Javascript alert (..) tut. Ich möchte ein Popup anzeigen, und dann anrufen und AJAX-Aufruf, auf dem es das Fenster schließt.ExtJS MessageBox blockiert nicht wie alert (..) tut

Wenn ich die Show Methode wie folgt dann rufen ...

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

..no Popup angezeigt wird, aber das übergeordnete Fenster ist geschlossen.

Wenn ich einen Standard-Javascript Alarm verwende, wird der Alarm blockiert. Nach dem Klicken auf die Schaltfläche OK wird der Rückruf ausgeführt, nach dem das Fenster geschlossen wird.

//Alert Box : 
    alert('asdf') 


    //callback 
    Ext.Ajax.request({ 
     url: someURL, 
     method: 'POST', 
     callback: function (options, success, response) { 
      //do some stuff 
      self.up('window').destroy(); 
     } 
    }) 
  • warum nicht blockiert MessageBox nicht?
  • Was kann ich tun, um dieses Problem zu umgehen?
  • muss die MessageBox irgendwie über das zu blockierende Elternfenster wissen?

Antwort

4

Es blockiert nicht, da Blöcke in benutzerdefinierten JavaScript-Code nicht unterstützt werden. Als Chromkonsole uns sagt,

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

und nativen Code kann die Ausführung blockieren.

In ExtJS, würden Sie einen Rückruf für ein Meldungsfeld wie folgt schreiben:

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

Wenn solche Rückrufe tief verschachtelt sind, neige ich dazu, die Rückrufe so zu glätten:

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

In neuere Versionen von ExtJS, können Sie Ext.Promise auschecken, aber nicht in ExtJS 4.1.

+0

Ja, ich habe es schließlich so umgesetzt. Es liest nicht sehr gut. Was passiert, wenn ich eine Situation habe, in der ich 5 Alarmfelder hintereinander habe? In Javascript hätte ich nur 5 Zeilen Alarm (..). In Extjs müsste ich 5 Nachrichtenboxen ineinander einbetten, die wie ein Durcheinander aussehen würden ... es sei denn, es gibt einen Weg mit Versprechen –

+0

@OliverWatkins Ich habe meine Antwort geändert. – Alexander

Verwandte Themen