обработка ошибок в хранилище extjs - PullRequest
6 голосов
/ 28 февраля 2011

Я пытаюсь обработать исключение в экземпляре Ext.data.Store при создании нового Ext.data.Record. Когда сервер отвечает следующим JSON:

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

Я получаю исключение типа 'запрос', даже если сервер возвращает ответ HTTP 200!

Чтобы получить «удаленную» ошибку, мне нужно создать объект со свойством root

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

... но я этого не хочу. Есть ли способ изменить это поведение?

Также, когда я вставляю запись в хранилище, она автоматически добавляется в связанную сетку, но если возникает ошибка, она остается там, поэтому мне нужно перезагрузить хранилище при каждой ошибке. Есть ли лучший способ сделать это?

Ответы [ 3 ]

10 голосов
/ 31 марта 2011

Вы должны поймать одно из двух событий Магазина:

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

Вы также можете просто использовать события success и fail из магазина, чтобы выполнить действие на основе флага success .

4 голосов
/ 04 апреля 2011

Наконец, я обнаружил, что если я отправляю обратно пустые данные, они работают как положено. Поэтому мне не нужно отправлять какие-либо вымышленные данные, мой ответ сервера:

({
    "success": false,
    "message": "some text",
    "data": {}
})
0 голосов
/ 13 мая 2014

, если успех равен false, операция не имеет свойства ответа. Эта тема объясняет это очень ясно!

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

...