ExtJS:在beforeload商店获取operation.error

时间:2017-09-08 13:45:35

标签: javascript extjs

我有这个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

console output

可以正确访问其他operation参数(即successlimit,...)。与operation['error']operation.getError()相同。

我不明白发生了什么。

1 个答案:

答案 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")
    }
}