3

同様の質問が何度も投稿されていることは知っていますが、それらの多くを読みましたが、私の問題に対する答えが見つかりません。

ajax リクエストの応答を待つ関数があります。多くの人が理由を尋ねるでしょう。さて、私はonLeaveAStepFunctionステップが残っているときに関数を実行するウィザード Jquery プラグインを使用しています。その後、戻り値onLeaveAStepFunctionが true の場合、ウィザードは選択されたステップに移動します。それ以外の場合は、同じステップにとどまります。

async: false待機のためにこれを行っていますが、機能しますが、これは悪い設計です。また、blockUI プラグインを使用できません。

これどうやってするの?

いくつかのコード:

ウィザードの初期化:

$("#wizard").smartWizard({
        onLeaveStep : onLeaveStepFunction,
    });

ajax リクエストの呼び出し:

function onLeaveStepCallback(obj, context) {
    nextStep = sendForm();
}

ajax リクエスト:

var nextStep = false;
$.ajax({
    url : path,
    type : "POST",
    async : false,
    data : $("#" + idForm).serialize(),
    success : function(data) {
        $("#" + idDiv).html(data);
        nextStep = !$("#" + idHiddenErrores).val())
    }
});

属性の省略。私を助けてください。

4

3 に答える 3

0

jQuery の wait メソッドを使用できます。ドキュメントページから例を挙げて、あなたがそれをどのように行うかを強調しました:

$.when( $.ajax( "/request.php" ) ).done(function( response ) {
        // response argument resolved from ajax requests
        // process any work after ajax call finishes
}

ドキュメントページへのリンク:

http://api.jquery.com/jquery.when/

于 2014-09-10T02:17:03.140 に答える
0

ハック的な回避策の 1 つは、leaveStep の前に実行することです。おそらくshowStepで:

var wizard_next_step;
$("#wizard").smartWizard({
    onShowStep : function (obj, context) {
        onLeaveStepFunction(obj, context, function(nextStep){
            wizard_next_step = nextStep;
        });
    },
    onLeaveStep : function () {
        return wizard_next_step;
    }
});

onLeaveStepFunctionまた、コールバックを受け入れるように変更する必要があります。

function onLeaveStepCallback(obj, context, callback) {
    nextStep = sendForm(callback);
}

そして、あなたのajax関数は次のようになります:

$.ajax({
    url : path,
    type : "POST",
    async : false,
    data : $("#" + idForm).serialize(),
    success : function(data) {
        $("#" + idDiv).html(data);
        callback( !$("#" + idHiddenErrores).val()) );
    }
});

これで、次のようにウィザード ウィンドウに描画しているように見えます。

$("#" + idDiv).html(data);

これが事実であるかどうか、私は完全に確信しています。しかし、そうであれば、ここでこれを行うことはできません (明らかに、onShowStep現在のコンテンツを上書きするためです)。その場合は、コールバックでデータを渡す必要があります。

success : function(data) {
    callback( data , !$("#" + idHiddenErrores).val()) );
}

ウィザードを次のように記述します。

var wizard_next_step;
var wizard_data;
$("#wizard").smartWizard({
    onShowStep : function (obj, context) {
        onLeaveStepFunction(obj, context, function(data, nextStep){
            wizard_data = data;
            wizard_next_step = nextStep;
        });
    },
    onLeaveStep : function (obj, context) {
        $("#" + idDiv).html(wizard_data);
        return wizard_next_step;
    }
});

重要なのは、すべての非同期関数を呼び出して、すべての同期関数を呼び出すずっと前にデータを取得することです。

注: 私はスマート ウィザードについてまったく知りませんし、真面目な jQuery ユーザーでもありません。上記の回答は、github でスマート ウィザードのドキュメントを 2 分間読んだことと、JavaScript についての私の理解に基づいています。それを機能させるには、間違いなく私の例を変更する必要があります。

于 2014-09-11T03:07:42.140 に答える
0

私はこの async: false を実行していますが、それは機能しますが、これは悪い設計であり、blockUI プラグインを使用できません。

ウィザードがより適切に設計されていて、非同期コールバック (promise を返すものなど) をサポートしていない限り、それasync:falseが唯一の選択肢です。

別のウィザードへの切り替えを検討し、現在使用しているプラ​​グインのバグを報告することを忘れないでください。

于 2014-09-11T00:06:44.043 に答える