我有这个ExtJS商店,使用Ajax远程加载:
Ext.create('Ext.data.Store', {
storeId: 'targetNamesStore',
fields: ['id', 'text'],
proxy: { type: 'ajax', url: 'test.php' },
listeners: {
beforeload: function(store, operation) {
console.log(operation);
console.log('error: ' + operation.error);
}
}
});
与服务器端的这个PHP代码一起:
<?php
echo json_encode([
'success' => false,
'msg' => 'Some details about the error.',
'metaData' => ['root' => 'data', 'messageProperty' => 'msg']
]);
?>
我想了解有关错误的详细信息,该错误似乎包含在operation
对象中。但是,当我尝试使用operation.error
时,undefined
:
可以正确访问其他operation
参数(即success
,limit
,...)。与operation['error']
和operation.getError()
相同。
我不明白发生了什么。
答案 0 :(得分:0)
在将请求发送到服务器之前调用beforeload
事件,因此操作对象中尚未提供该错误。
您在登录浏览器控制台的对象在操作过程中就地修改,当您在浏览器控制台中查看时,您只能看到它在查看时的状态。
在标准ExtJS中,在接收数据并将其加载到商店之间不会抛出任何事件。如果必须,可以添加一个。
我是通过在各种项目中覆盖函数Ext.data.reader.Json.getResponseData
和/或Ext.data.reader.Json.readRecords
来实现的。
E.g。在一个项目中,我将服务器发送的错误消息输出添加到消息框中:
readRecords: function(data) {
var me = this,
caption = 'Generic error',
message = 'The server reported an error, but did not provide any details.';
if (me.getSuccessProperty()) {
if(!data || me.getSuccess(data)===false) {
if(data.Message) message = data.Message;
if(data.Caption) caption = data.Caption;
Ext.Msg.alert(caption,message);
}
}
return me.callParent(arguments);
}
但您也可以执行以下操作,这将更加符合ExtJS的风格(以下所有代码均未经测试且无保修):
readRecords: function(data) {
var records = [];
if(this.fireEvent('beforereadrecords', this, data)!==false) records = this.callParent(arguments);
this.fireEvent('readrecords', this, data, records);
return records;
}
并允许您将这些侦听器添加到阅读器中:
type: 'json',
rootProperty: 'test',
listeners: {
beforereadrecords: function(data) {
// beforereadrecords is cancelable, like all beforesomethingsomething events.
if(...) return false;
},
readrecords: function(data, records) {
records[1].set("something", "something else")
}
}