2011-02-28 81 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