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 にはバグがあり、プログラマーがキューのように呼び出すことができないため、エラー メッセージを表示するのは難しい部分です。ユーザーは [OK] をクリックします。常に前のものを消去し、新しいものを表示します。ユーザーが 2 つのパスを決定する必要があり、質問メッセージ ボックスが簡単に消えてしまう場合、この動作は深刻なバグにつながる可能性があります。 最後に、false を返し、エラーがコンソールに出力されます。この時点で true を返すと、呼び出し元の関数は実行を継続し、期待される情報が存在しない可能性が高いため、問題が発生します。

この解決策はトリッキーで、汚れていて、まったく快適ではありません。今はうまくいっていますが、すぐに後悔することはわかっています:P

于 2012-04-24T21:25:03.297 に答える