2011-02-28 18 views
6

Estoy tratando de manejar una excepción en una instancia Ext.data.Store al crear un nuevo Ext.data.Record. Cuando el servidor responde con el siguiente JSON:extjs store error handling

{"success": false, "message": "some text"} 

consigo una excepción de tipo 'solicitud', a pesar de que el servidor devuelve una respuesta HTTP 200!

Para obtener un error 'remota' Tengo que crear un objeto con la propiedad root

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

... pero no quiero esto. ¿Hay alguna forma de cambiar este comportamiento?

Además, cuando inserto un registro en la tienda, se agrega automáticamente a la cuadrícula asociada, pero si ocurre un error permanece ahí, por lo que debo volver a cargar la tienda en cada error. ¿Hay alguna forma mejor de hacer esto?

+0

se puede construir en su pregunta un poco? Por ejemplo, ¿dónde está recibiendo los errores de 'solicitud' o 'remota' que está viendo? Si está en un oyente de 'loadexception' en la tienda, entonces solo debería tener tipos de excepción de 'respuesta' y 'remoto'. ¿Dónde ves un error de "solicitud"? Si puede proporcionar ejemplos de código, eso ayudará mejor a responder su pregunta. –

Respuesta

4

Finalmente, descubrí que si envío datos vacíos, funciona como se esperaba. Así que no es necesario volver a enviar los datos ficticios, mi respuesta del servidor es:

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

¿puedo tener un poco más de detalles? Intenté lo mismo, pero aún tengo que volver a cargar la cuadrícula :( – Leonid

+1

Creo que cuando no tiene propiedad de raíz en la respuesta, el lector falla y el evento de carga no se dispara. Pero cuando se envían desencadenantes de eventos de carga y resultados "vacíos" usted puede verificar json devuelto (en ext4.2 al menos) como este: this.getProxy(). getReader(). rawData; – meta

+0

cuando el éxito es falso no puede acceder a la propiedad de respuesta en el objeto de operación. Consulte http: // www.sencha.com/forum/showthread.php?196013-access-operation.response-when-success-false –

10

Debe coger uno de los dos eventos de las tiendas:

  1. loadexception (obsoleto)
  2. exception

Por ejemplo, usted podría:

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

También puede simplemente use el éxito y error eventos de la tienda para tomar medidas basadas en éxito marca.

0

cuando el éxito es falsa operación no tiene una propiedad de respuesta. ¡Este hilo lo explica muy clairly!

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

Ejemplo:

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

Implementación:

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.'); 
         } 
        } 
       } 
      }); 

Saludos @ code4jhon