1

私は最近 Javascript の世界に足を踏み入れたばかりの Java 開発者です。ネイティブ ブラウザ/js の「確認」ダイアログ ボックスを、主にバックボーン フレームワークを使用して開発されたカスタム モーダルに変換しようとしています。現在、これらのモーダルは「確認」タイプの機能をサポートしていません。主な問題は、モーダルが現在非同期で動作していないことだと思います。

モーダルを開くメソッドを呼び出しており、ユーザーがクリックしたボタンに応じて、呼び出しから「true」または「false」の値を受け取ることを望んでいます。ただし、現在、私のメソッドはモーダルが表示されるとすぐに戻り、ボタンのクリックを待ちません。モーダル システムは、以下で説明するように、「openPortletModal」メソッドを呼び出すときに定義できる、ボタンごとに個別のコールバックをサポートします。ただし、「confirmDiscard」メソッドは、ボタン呼び出しを待たずに未定義の値を返します。私の質問は、コールバックが行われるまでメソッドの実行を一時停止することは可能ですか?

調査中に、jQuery.Deferred について少し調べましたが、必要な機能を得るためにそれを利用する明確な方法が見つかりませんでした。また、コールバックに基づいて異なる戻り値が含まれている例も見当たりません。

ここに私のサンプルコードがあります:

confirmDiscard: function(context) {
    var deferred = new $.Deferred();

    MyModal.openPortletModal(context, null, {
    views: [{
        name: "auth",
        title: "Confirmation",   
        renderResponseData: "This is a test",  //Message that modal renders
        buttons: [{
        type: "FINISH",
        label: "OK",
        click: function() {
            console.log("CLICKED OK");
            deferred.resolve("true");  //this is ultimately what I'd like to return from the confirmDialog() method
            return false; //Modal system expects a "false" value from callback if there is no AJAX call to be made.
        },
        }, {
        type: "CANCEL",
        click: function() {
            console.log("CLICKED CANCEL");
            deferred.resolve("false");  
            return false;
        },
        }]
    }]
    });

    deferred.done(function(value) {             
    alert(value);  //This does get called on button click, but by now the confirmDiscard method has already returned.
    return value;
    })

    return deferred.promise();
},

このパターンを考えると、モーダルが応答している間、このメソッドを待機させる方法は JavaScript にありますか?

4

1 に答える 1

0

私はあなたのような方法をお勧めしますが、少し異なります。お役に立てば幸いです。

cutomConfirm: function(text) {
    var d, rendered, template,
    _this = this;

    template = $('#custom_confirm_temp');
    rendered = $.tmpl($(template).template(), {
        text: text || ''
    });

    $.blockUI({
        message: rendered,
        showOverlay: true,
        onUnblock: function() {
            return $(document).unbind('click');
        },
        css: {
          width: '600px',
          height: '150px',
          opacity: '1',
          border: '0',
          backgroundColor: 'none'
        }
    });

    d = $.Deferred();

    rendered.find('#OK').click(function() {
        $.unblockUI();
        return d.resolve();
    });

    rendered.find('#CANCEL').click(function() {
        $.unblockUI();
        return d.reject();
    });

    return d;
}

テンプレートを (id ="custom_confirm_temp" で) 作成し、必要なときに呼び出す必要があります。

于 2013-08-22T07:48:56.157 に答える