0

在这里,我们再次使用 Ext JS。

假设我有一个向应用程序的 Web 服务器提交图像的文件上传 (Ext.form.field.File) 字段。

每当我在提交表单时收到内部服务器错误(状态代码 = 500)(即:发布的文件大于 Web 服务器的最大请求长度)时,Ext 就会抛出一个异常,显示在浏览器的控制台上。

如果我像这样覆盖 Ext.Error.handle,我可以及时发现错误:

<!-- language: js -->
Ext.Error.handle = function (err) {

    switch (err.sourceClass) {
        case "Ext.JSON":
            {
                var arr = err.msg.split('\n');
                var msg = arr[0];
                arr.shift();
                var serverMsg = arr.join('\n');

                LogManager.error(msg);
                return true;
            }
        default:
            {
                if (err.msg) {
                    LogManager.error(err.msg);
                    return true;
                }
            }
            return false;
    }
}

问题是无论我是否发现错误,Ext 创建的模态进度条仍然显示,这意味着我的应用程序被永久锁定。

问题是:如何让 Ext 触发表单的失败回调并以愉快的方式关闭进度条?

4

2 回答 2

1

我认为最干净的方法是让您使用表单提交失败回调来处理内部服务器(500)错误。

有关更多信息,请参阅文档http://docs.sencha.com/ext-js/4-1/#!/api/Ext.form.Basic-method-submit

你可以设置一个waitMsg 属性,你会看到Ext 会自动取消正在显示的消息。像这样...

myFormPanel.getForm().submit({
    clientValidation: true,
    waitMsg: 'Uploading image...',
    url: 'updateConsignment.php',
    params: {
        newStatus: 'delivered'
    },
    success: function(form, action) {
       Ext.Msg.alert('Success', action.result.msg);
    },
    failure: function(form, action) {
        switch (action.failureType) {
            case Ext.form.action.Action.CLIENT_INVALID:
                Ext.Msg.alert('Failure', 'Form fields may not be submitted with invalid values');
                break;
            case Ext.form.action.Action.CONNECT_FAILURE:
                Ext.Msg.alert('Failure', 'Ajax communication failed');
                break;
            case Ext.form.action.Action.SERVER_INVALID: //For your 500
               Ext.Msg.alert('Failure', action.result.msg);
       }
    }
});
于 2013-03-10T10:38:50.673 回答
0

我刚刚找到了一个解决此问题的肮脏解决方案,即使用 Ext.Error.handle 处理错误,使用 Ext.Msg 显示错误消息 abd return false。这很棘手。

通过处理错误,我可以检查错误事件并检索一些错误信息。显示错误消息是比较棘手的部分,因为上传的进度条使用 Ext.Msg 后面的相同基础结构,并且 Ext.Msg 有一个错误,它不允许程序员像队列一样调用它,显示一条消息,然后显示下一条消息用户单击确定。它总是删除前一个并显示新的。如果用户必须决定两条路径并且问题消息框将简单地消失,那么这种行为可能会导致可怕的错误! 最后,我们返回 false 并在控制台中打印错误。如果我们此时返回 true,调用函数将继续执行并导致问题,因为预期的信息很可能不存在。

这个解决方案很棘手,很脏,而且一点也不愉快。它现在对我有用,但我知道我很快就会后悔:P

于 2012-04-24T21:25:03.297 回答