2012-04-20 108 views
0

這裏我們再次使用Ext JS。Ext JS 4的文件上傳和內部服務器錯誤

假設我有一個文件上傳(Ext.form.field.File)字段,它將圖像提交給應用的Web服務器。

每當我在表單的提交中發現內部服務器錯誤(狀態碼= 500)(即:發佈的文件大於Web服務器的最大請求長度)時,Ext將在瀏覽器的控制檯上顯示一個異常。

我能及時捕捉到錯誤,如果我重寫Ext.Error.handle這樣的:

<!-- language: js --> 
Ext.Error.handle = function (err) { 

    switch (err.sourceClass) { 
     case "Ext.JSON": 
      { 
       var arr = err.msg.split('\n'); 
       var msg = arr[0]; 
       arr.shift(); 
       var serverMsg = arr.join('\n'); 

       LogManager.error(msg); 
       return true; 
      } 
     default: 
      { 
       if (err.msg) { 
        LogManager.error(err.msg); 
        return true; 
       } 
      } 
      return false; 
    } 
} 

問題是,無論我捕獲錯誤或不模態進度條分機創建顯示遺體,這意味着我的應用程序鎖定好。

問題是:如何使Ext觸發窗體的失敗回調並以愉快的方式關閉進度欄?

回答

0

我剛剛發現了一個骯髒的解決方案,這個問題是使用Ext.Error.handle來處理錯誤,使用Ext.Msg來顯示錯誤消息abd return false。這很棘手。

通過處理錯誤我可以檢查錯誤事件並檢索一些錯誤信息。 顯示錯誤消息是更棘手的部分,因爲上傳的進度條使用Ext.Msg後面的相同基礎結構,Ext.Msg有一個錯誤,它不允許程序員將它稱爲隊列,顯示一條消息,然後顯示下一條消息用戶單擊確定。它總是擦除前一個並顯示新的。 如果用戶決定了兩個路徑並且問題消息框將會簡單地消失,此行爲可能會導致可怕的錯誤! 最後,我們返回false並將錯誤打印在控制檯中。如果我們在這一點上返回true,調用函數將繼續執行並導致問題,因爲預期的信息很可能不會在那裏。

這個解決方案很棘手,很髒,而且根本不舒服。它適用於我現在,但我知道我會很快後悔它:P

+0

只需使用靜態方法創建一個ExtJS類,並在'form.submit({})'調用中重用它。對於商店同步錯誤,最好是傾聽代理錯誤。 – 2013-11-18 12:39:10

1

我認爲最乾淨的方法,將爲您使用表單提交失敗回調來處理內部服務器(500)的錯誤。

查看文檔以獲取更多信息http://docs.sencha.com/ext-js/4-1/#!/api/Ext.form.Basic-method-submit

您可以設置waitMsg屬性,您會看到Ext會自動取消正在顯示的消息。像這樣...

myFormPanel.getForm().submit({ 
    clientValidation: true, 
    waitMsg: 'Uploading image...', 
    url: 'updateConsignment.php', 
    params: { 
     newStatus: 'delivered' 
    }, 
    success: function(form, action) { 
     Ext.Msg.alert('Success', action.result.msg); 
    }, 
    failure: function(form, action) { 
     switch (action.failureType) { 
      case Ext.form.action.Action.CLIENT_INVALID: 
       Ext.Msg.alert('Failure', 'Form fields may not be submitted with invalid values'); 
       break; 
      case Ext.form.action.Action.CONNECT_FAILURE: 
       Ext.Msg.alert('Failure', 'Ajax communication failed'); 
       break; 
      case Ext.form.action.Action.SERVER_INVALID: //For your 500 
       Ext.Msg.alert('Failure', action.result.msg); 
     } 
    } 
});