kalan
kalan

Reputation: 1832

extjs store error handling

I am trying to handle an exception in an Ext.data.Store instance when creating a new Ext.data.Record. When the server responds with the following json:

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

I get an exception of type 'request', even though the server returns an HTTP 200 Response!

To get a 'remote' error I have to create an object with the root property

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

...but I don't want this. Is there any way to change this behaviour?

Also, when I insert a record in the store, it is automatically added to the associated grid, but if an error occurs it remains there, so I need to reload store on every error. Is there any better way to do this?

Upvotes: 6

Views: 24741

Answers (3)

Joseph Lust
Joseph Lust

Reputation: 19975

You should catch one of the two Store events:

  1. loadexception (deprecated)
  2. exception

For example you could:

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

You could also just use the success and failure events from the store to take action based on the success flag.

Upvotes: 12

code4jhon
code4jhon

Reputation: 6034

when success is false operation doesn't have a response property. This thread explains it very clairly!

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

Example:

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

Implementation:

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

Best regards @code4jhon

Upvotes: 0

kalan
kalan

Reputation: 1832

Finally, I've found out that if I send back empty data it works as expected. So I don't need to send back any fictional data, my server response is:

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

Upvotes: 4

Related Questions