从商店代理

时间:2017-01-24 08:07:31

标签: extjs extjs4

我想从商店代理呼叫中收到错误消息。

我的商店看起来像这样:

Ext.define("MyStore", {
    extend: "Ext.data.Store",
    model: 'mymodel',
    proxy: {
        type: 'customrest',
        paramsAsJson: true,
        url: myUrl,
        actionMethods: {
            read: 'POST'
        },
        reader: {
            type: 'json',
            record: 'result',
            root: 'results'
        }
    },

    listeners: {
        load: function (store, records, success) {
            if (!success) {

            }else {
                //OK
        }
        }
    }
});

似乎只给我成功是假的,并且没有其他信息可以随时到达。我知道还会有一条错误消息回来,因为回来的数据如下所示:

  

{success:false,message:" blah blah blah“"}

是否有某个地方我可以处理消息'?

更新:

我的商店被称为:

this.psstore = Ext.getStore("MyStore"); 

this.psstore.load({
    params: postBody,
    callback: function (records, operation, success) {

        if (success) {

2 个答案:

答案 0 :(得分:2)

查看您的读者messageProperty

http://docs.sencha.com/extjs/4.0.7/#!/api/Ext.data.reader.Json-cfg-messageProperty

所以在你的配置中你应该有:

    reader: {
        type: 'json',
        record: 'result',
        root: 'results',
        messageProperty: 'message'
    }

然后,您应该能够通过load回调中的operation.exception属性(IIRC)获取消息。它也是onLoad事件(http://docs.sencha.com/extjs/4.0.7/#!/api/Ext.data.Store-event-load)中传递的参数,因此您也应该能够在那里访问它。我们在Ext 4上使用XML阅读器,并在升级到6时使用它,以便安全使用。

答案 1 :(得分:1)

是的,有,但不,你不应该使用它。

在您的情况下,在ExtJS 6之前的ExtJS中,您可以轻松地从getStore().getProxy().getReader().rawData读取整个原始响应,除非您在阅读器定义中设置了keepRawData:false。这有一个很大的

在6.0中,如果您不在阅读器上使用keepRawData,原始响应数据会很早就被删除。原因,引用文档:请注意,从Ext JS 6.0开始,默认行为已更改为不保留原始数据,因为内存泄漏的可能性很高。

因此,我在ExtJS 6.0.1的阅读器上添加了一个覆盖:

Ext.define("MyApp.override.JsonReader", {
    override:"Ext.data.reader.Json",
    /**
     * Make additional processing available on the raw response.
     */
    processRawResponse:null,
    getResponseData:function(response) {
        if(this.processRawResponse) this.processRawResponse(response);
        me.callParent(arguments);
    }
});

所以现在我可以根据需要在每个读者上添加一个processRawResponse函数,如下所示:

proxy: {
    type: 'ajax',
    groupParam: false,
    startParam:false,
    limitParam:false,
    pageParam:false,
    sortParam:false,
    url: '../api/AdminPanel/ACLRules',
    headers: {
        Accept: 'application/json'
    },
    reader: {
        type: 'json',
        rootProperty: 'data',
        processRawResponse:function(response) {
            var responseText = Ext.decode(response.responseText, true);
            if(responseText && responseText.message) {
                Ext.Msg.alert('ERROR',responseText.message);
            }

您可以尝试这是否也适用于ExtJS 4; from the source code, it seems so。否则,只需要进行微小的更改。

如果您的错误消息每次都在同一个属性中,并且每次都需要相同的处理,您也可以直接从覆盖中全局处理它们,例如:如果你得到一系列调试信息:

getResponseData:function(response) {
    if(this.processRawResponse) this.processRawResponse(response);
    var debugList = Ext.getCmp("debugList"),
        shorten = function(tex) {
            return tex.substring(0,500).replace(/(\r\n|\r|\n)/g,"<br>");
        },
        returned = "";
    try {
        returned = response.responseText;
        var decodedData = Ext.decode(returned);
        if(decodedData.Debug) this.rawDebugData = decodedData.Debug;
        return decodedData;
    } catch (ex) {
        var caption = "Decoding error",
            message = "The server has returned malformed JSON.",
            box = Ext.create('Ext.window.MessageBox',{});
        try {
            var jsonStart = Math.min(returned.indexOf('['), returned.indexOf('{'));
            if(jsonStart>0) {
                message = (message + "\n" + returned.substring(0,jsonStart));
                returned = returned.substring(jsonStart);
            }
            else {
                message = (message + "\n" + returned);
            }
        } catch (e) {
        }
        if(!debugList) box.alert(caption,shorten(message));
        if(debugList) debugList.setValue(debugList.getValue()+caption+': '+message+'\n');
        return Ext.decode(returned, true) || {};
    }
},