extjsストアエラー処理

error-handling extjs json jsonstore
extjsストアエラー処理

新しい Ext.data.Record`を作成するときに、 Ext.data.Store`インスタンスで例外を処理しようとしています。 サーバーが次のjsonで応答する場合:

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

サーバーがHTTP 200応答を返しても、タイプ ‘request’の例外が発生します!

「リモート」エラーを取得するには、「root」プロパティでオブジェクトを作成する必要があります

({
    "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?

また、レコードをストアに挿入すると、関連付けられたグリッドに自動的に追加されますが、エラーが発生した場合はそこに残るため、エラーが発生するたびにストアをリロードする必要があります。 これを行うより良い方法はありますか?

  6  0


ベストアンサー

次の2つのストアイベントのいずれかをキャッチする必要があります。

  1. loadexception(廃止予定)

  2. 「例外」

たとえば、

// 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_フラグに基づいてアクションを実行することもできます。

10


最後に、空のデータを送り返すと期待どおりに動作することがわかりました。 したがって、架空のデータを返送する必要はありません。サーバーの応答は次のとおりです。

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

4


成功が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

0


タイトルとURLをコピーしました