2011-02-28 110 views
6

我試圖在創建新的Ext.data.Record時處理Ext.data.Store實例中的異常。當服務器使用以下json響應時:即使服務器返回HTTP 200響應,我也會得到'request'類型的異常!extjs存儲錯誤處理

爲了得到一個「遠程」的錯誤,我必須與root財產

({ 
    "success": false, 
    "message": "some text", 
    "data": { 
     "PositionId": "00000000-0000-0000-0000-000000000000", 
     "Name": "123" 
    } 
}) 

創建一個對象......但我不想這樣。有什麼方法可以改變這種行爲嗎?另外,當我在存儲中插入一條記錄時,它會自動添加到關聯的網格,但是如果發生錯誤,它仍然存在,因此我需要在每次錯誤時重新加載存儲。有沒有更好的方法來做到這一點?

+0

你可以以你的問題一點?例如,您在哪裏看到「請求」或「遠程」錯誤?如果它位於商店的'loadexception'偵聽器中,那麼它應該只有'response'和'remote'的異常類型。你在哪裏看到'請求'錯誤?如果您可以提供代碼示例,那將更好地幫助解答您的問題。 – 2011-03-11 16:30:21

回答

4

最後,我發現如果我發回空數據,它按預期工作。所以我不需要回送任何虛構的數據,我的服務器響應是:

({ 
    "success": false, 
    "message": "some text", 
    "data": {} 
}) 
+0

我可以稍微詳細一點嗎?我試過同樣的,但仍然必須重新加載網格:( – Leonid 2012-02-24 13:42:19

+1

我認爲當你沒有響應的根屬性,閱讀器失敗,加載事件不會觸發。但是當你發送空結果事件「加載」觸發器和您可以檢查返回的json(至少在ext4.2中),如下所示:this.getProxy()。getReader()。rawData; – meta 2013-05-02 08:32:32

+0

當成功爲false時,您無法訪問操作對象的響應屬性,請參閱http://萬維網。sencha.com/forum/showthread.php?196013-access-operation.response-when-success-false – 2014-05-26 18:13:22

10

你應該抓住這兩個商店的事件之一:

  1. loadexception(不建議使用)
  2. exception

例如,你可以:

// make the store 
var myStore = new Ext.data.Store({...}); 
// catch loading exceptions 
myStore.on('exception',function(store, records, options){ 
    // do something about the record exception 
},this); 
// load store 
myStore.load(); 

你也可以只使用成功失敗事件從商店採取行動根據成功標誌。

0

時成功是假的操作不會有響應特性。這個線程非常好地解釋它!

http://www.sencha.com/forum/showthread.php?196013-access-operation.response-when-success-false

例子:

Ext.define("SC.store.SegurosCancelacionStore", { 
    extend: "Ext.data.Store", 
    model: "SC.model.PersonaSeguro", 
    proxy: { 
     timeout: 90000, 
     actionMethods: { 
      read : 'POST' 
     }, 
     type: "ajax", 
     url: "../SegurosFinsolCancelacionServlet", 
     reader: { 
      type: "json", 
      root: "seguros", 
      messageProperty : 'msjError' //without this, it doesn't work 
     } 
    }, 
    autoLoad: false 
}); 

實現:

storeSegurosCancelacion.load({ 
       params: { 
        'sucursal':sucursal, 
        'persona': persona 
       }, 
       callback:function(records, operation, success){ 
        msg.hide(); 
        if(success == true){ 
         if(records.length == 0){ 
         Ext.Msg.alert('Resultado', 'No se ha encontrado información'); 
         } 
        } 
        if(success == false){ 
         try{ 
          Ext.Msg.alert('Error', operation.getError()); // way more elegant than ussing rawData etc ... 
         }catch(e){ 
           Ext.Msg.alert('Error', 'Error inesperado en el servidor.'); 
         } 
        } 
       } 
      }); 

問候 @ code4jhon