extjs хранит обработку ошибок

Я пытаюсь обработать исключение в экземпляре 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"
    }
})

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

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


person kalan    schedule 28.02.2011    source источник
comment
Можете ли вы немного развить свой вопрос? Например, где вы получаете ошибки «запроса» или «удаления», которые вы видите? Если он находится в прослушивателе «loadexception» в хранилище, то он должен иметь только типы исключений «response» и «remote». Где вы видите ошибку запроса? Если вы можете предоставить примеры кода, это поможет лучше ответить на ваш вопрос.   -  person Sean Adkinson    schedule 11.03.2011


Ответы (3)


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

  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 и failure из хранилища, чтобы выполнить действие на основе флага success.

person Joseph Lust    schedule 30.03.2011

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

({
    "success": false,
    "message": "some text",
    "data": {}
})
person kalan    schedule 04.04.2011
comment
можно немного подробнее? я пробовал то же самое, но все равно приходится снова перезагружать сетку :( - person Leonid; 24.02.2012
comment
Я думаю, что когда у вас нет корневого свойства в ответе, считыватель не работает, и событие загрузки не срабатывает. Но когда вы отправляете триггеры загрузки событий с пустыми результатами, вы можете проверить возвращенный json (по крайней мере, в ext4.2) следующим образом: this.getProxy().getReader().rawData; - person Grzegorz; 02.05.2013
comment
когда успех равен false, вы не можете получить доступ к свойству ответа на объекте операции. См. sencha.com/forum/ - person code4jhon; 26.05.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

person code4jhon    schedule 12.05.2014