extjs存储错误处理

时间:2011-02-28 11:01:25

标签: json extjs error-handling jsonstore

我正在尝试在创建新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 个答案:

答案 0 :(得分:10)

你应该抓住两个商店活动中的一个:

  1. loadexception(已弃用)
  2. exception
  3. 例如你可以:

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

    您还可以使用商店中的成功失败事件,根据成功标记执行操作。

答案 1 :(得分:4)

最后,我发现如果我发回空数据,它会按预期工作。所以我不需要发回任何虚构的数据,我的服务器响应是:

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

答案 2 :(得分: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