2

WinJSを使用して、「続行」ボタンを押したばかりのユーザーに、質問に答えていないというメッセージを表示しようとしています。これにより、2 つのボタンを含むダイアログ (Windows.UI.Popups.MessageDialog) が表示され、ユーザーは今すぐ回答する (したがって、回答された質問にとどまる) か、後で回答する (したがって、次の質問に直接進む) かを選択できます。 . Javascript では、通常、ユーザーが選択を行うまで実行を停止する確認ダイアログを使用し、返された値を使用して次の質問を表示するかどうかを決定できます。WinJS では、コードの実行は停止しません。ダイアログを表示する関数は次のとおりです。

function doSillyMessage(message, title) {
    var messagedialogpopup = new Windows.UI.Popups.MessageDialog(message, title);
    // Add commands and set their CommandIds
    messagedialogpopup.commands.append(new Windows.UI.Popups.UICommand("Answer now", null, 1));
    messagedialogpopup.commands.append(new Windows.UI.Popups.UICommand("Answer later", null, 2));

    // Set the command that will be invoked by default
    messagedialogpopup.defaultCommandIndex = 0;

    // Show the message dialog
    messagedialogpopup.showAsync().done(function (command) {
        if (command) {
            if (command.id == 1) {
                console.log('proceed in popup is false');
                proceed = false;
            }
            else if (command.id == 2) {
                console.log('proceed in popup is true');
                proceed = true;
            }

        }
    });
}

問題は、doSillyMessage が呼び出された時点で、コードが待機せず、'proceed' 変数の現在の値が何であれ続行することです。たとえば、doSillyMessage が呼び出された時点で「proceed」の値が false の場合、doSillyMessage が呼び出された後も false になり、(適切な場合) 後でのみ true に変更され、コンソールに「proceed in」と表示されます。ポップアップは真です。これを正しい順序で実行するにはどうすればよいですか?

4

2 に答える 2

2

最終的に、確認やアラートなどを管理するためのダイアログ ヘルパー セットを作成しました。

ヘルパー

function confirmAsync(title, msg) {

    // define confirmation buttons
    var buttons = [
        new Windows.UI.Popups.UICommand("Yes"),
        new Windows.UI.Popups.UICommand("No")];

    // make sure to return the showAsync() promise so we can chain from the call to confirmAsync
    return dialogInterceptor(title, msg, buttons).showAsync();

}


function dialogInterceptor(title, msg, buttons) {

    // create dialog
    var dialog = new Windows.UI.Popups.MessageDialog(msg, title);

    // optionally add buttons
    if (buttons) {

        buttons.forEach(function(button) {

            dialog.commands.append(button);

        });

    }

    // return dialog
    return dialog;
}

使用法:

            confirmAsync("Confirmation title text", "Are you sure you want to do something?")
                .done(function (button) {

                    if (button.label === "Yes") {

                        functionToCallWhenYesIsClicked();
                    }

            });

ただし、一般的には、ダイアログから promise を返して、後で処理できるようにします。最初のダイアログから 2 番目のダイアログを起動しようとしないように注意してください。

于 2013-06-13T07:55:06.260 に答える