我想从商店代理呼叫中收到错误消息。
我的商店看起来像这样:
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) {
答案 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) || {};
}
},