2012-12-07 5 views
11
function ValidateField(){ 
var bAllow= true; 

    //some checking here 

if (bAllow == true && apl.val().trim() == "") 
{ 
    showDialog(); 
    showDialog().done(function() { 
     return true; // wanna return true, but not success 
    }).fail(function() { 
     return false; //wanna return false, but not success 
    }); 
    return false; //stop it to execute to next line 
} 
return bAllow; //success return } 

function showDialog(){ 
var def = $.Deferred(); 
var modPop = '<div id="diaCom" title="Information?"><p>something something</p></div>'; 
$("#diaCom").remove(); 
$(modPop).appendTo('body'); 
$("#diaCom").dialog({ 
    resizable: false, 
    draggable: false, 
    height:150, 
    width:300, 
    modal: true, 
    buttons: { 
     "Ok": function() { 
      def.resolve(); 
      $(this).dialog("close"); 

     }, 
     "Cancel": function() { 
      def.reject(); 
      $(this).dialog("close"); 

     } 
    } 
}); 

return def.promise(); 
} 
//on click 
if (validateField() == true){ 
     //do something 
}else{ 
     //do something 
    } 

こんにちは、誰もが値を返すのですか?私はshowDialog()。done()によってtrueとfalseを返すことを望み、validatefield()関数では失敗しますが、私が望むものとして機能しません。次の行、任意のアイデアを実行するダイアログですか?それとも、このようにするのは正しいですか?jQuery Deferred and Dialogbox

+0

あなたはJavascriptが繰延オブジェクトの完了を待機させることができなくなりますので、 '復帰に方法はありません'後で。私はこれを "修正"する方法がわかりませんが、コード/ロジックを再編成する方法があると思います。 – Ian

+0

いいえ、非同期タスクから同期的に返すことはできません。代わりに、延期! – Bergi

+0

これは、別の関数に渡したことを意味します.nは、同じ関数の代わりに検証チェックを行うために他の関数を使用しますか?そうする正しい方法を私に少し教えてもらえますか?グローバル変数を作成し、defferendに基づいてtrue/faseに設定してから、別の関数でグローバル変数を使用してチェックを行い、その後でtrue/falseを返す関数を使用しますか?私はまだdefferedに新しい、ちょうどGoogle nのパズルを検索するそれのようなものを出す – Se0ng11

答えて

27

これはうまくいきます。

あなたのダイアログ機能...にShowDialog()

function confirmation(question) { 
    var defer = $.Deferred(); 
    $('<div></div>') 
     .html(question) 
     .dialog({ 
      autoOpen: true, 
      modal: true, 
      title: 'Confirmation', 
      buttons: { 
       "Yes": function() { 
        defer.resolve("true");//this text 'true' can be anything. But for this usage, it should be true or false. 
        $(this).dialog("close"); 
       }, 
       "No": function() { 
        defer.resolve("false");//this text 'false' can be anything. But for this usage, it should be true or false. 
        $(this).dialog("close"); 
       } 
      }, 
      close: function() { 
       $(this).remove(); 
      } 
     }); 
    return defer.promise(); 
} 

し、機能を使用し、コード...

function onclick(){ 
    var question = "Do you want to start a war?"; 
    confirmation(question).then(function (answer) { 
     var ansbool = Boolean.parse(answer.toString()); 
     if(ansbool){ 
      alert("this is obviously " + ansbool);//TRUE 
     } else { 
      alert("and then there is " + ansbool);//FALSE 
     } 
    }); 
} 

これはほとんどの人々のために間違って見えるかもしれません。しかし、JQuery Dialogから戻ってくることができない状況が常にあります。

これは基本的にconfirm()関数を模倣します。しかし、醜いコードと素晴らしい確認ボックスの外観:)

私はこれがいくつかの人々を助けてくれることを願っています。


EDIT:3ソリューション


ブートストラップ私は今 NakuPanda'sブートストラップ・ライブラリを使用しています、それは本当によく働きます。基本的にJQueryUIと同じですが、Bootstrap UIでは同じです。

function bsConfirm(question) { 
    var defer = $.Deferred(); 
    BootstrapDialog.show({ 
     type: BootstrapDialog.TYPE_PRIMARY, 
     title: 'Confirmation', 
     message: question, 
     closeByBackdrop: false, 
     closeByKeyboard: false, 
     draggable: true, 
     buttons: [{ 
      label: 'Yes', 
      action: function (dialog) { 
       defer.resolve(true); 
       dialog.close(); 
      } 
     }, { 
      label: 'No', 
      action: function (dialog) { 
       defer.resolve(false); 
       dialog.close(); 
      } 
     }], 
     close: function (dialog) { 
      dialog.remove(); 
     } 
    }); 
    return defer.promise(); 
} 
function bsAlert(error, message) { 
    BootstrapDialog.show({ 
     type: error ? BootstrapDialog.TYPE_DANGER : BootstrapDialog.TYPE_SUCCESS, 
     title: error ? "Error" : "Success", 
     message: message, 
     closeByBackdrop: false, 
     closeByKeyboard: false, 
     draggable: true, 
     buttons: [{ 
      label: 'OK', 
      action: function (d) { 
       d.close(); 
      } 
     }] 
    }); 
} 

し、それを使用して、私はthis JSFIDDLEを作成し、それが吹いたために、ブール解析を変更した

bsConfirm("Are you sure Bootstrap is what you wanted?").then(function (a) { 
    if (a) { 
     bsAlert("Well done! You have made the right choice"); 
    } else { 
     bsAlert("I don't like you!"); 
    } 
}); 
+7

私は何度も同じようなアプローチを使いました。注意:あなたのコードでは、DOM内にコンフィグレーションされた '

'を残すでしょう - ダイアログの 'close'ハンドラで' $(this).dialog( 'destroy')。remove() 'が必要です。 – Alnitak

+0

@Pierre:Deferredのライブラリを追加して仕事をする必要がありますか? – ChandniShah

+0

@ChandniShah Jquery 1.5+は組み込み関数です。詳細はhttps:// api.jquery.com/category/deferred-object/'を参照してください。 – Pierre

4

(ほとんど同じように)。ありがとう、ピエール!これは私に多くの時間を節約しました。

のjavascript:

function confirmation(question) { 
var defer = $.Deferred(); 
$('<div></div>') 
    .html(question) 
    .dialog({ 
     autoOpen: true, 
     modal: true, 
     title: 'Confirmation', 
     buttons: { 
      "Yes": function() { 
       defer.resolve("true");//this text 'true' can be anything. But for this usage, it should be true or false. 
       $(this).dialog("close"); 
      }, 
      "No": function() { 
       defer.resolve("false");//this text 'false' can be anything. But for this usage, it should be true or false. 
       $(this).dialog("close"); 
      } 
     }, 
     close: function() { 
      //$(this).remove(); 
      $(this).dialog('destroy').remove() 
     } 
    }); 
return defer.promise(); 
}; 

function onclick(){ 
var question = "Do you want to start a war?"; 
confirmation(question).then(function (answer) { 
    console.log(answer); 
    var ansbool = (String(answer) == "true"); 
    if(ansbool){ 
     alert("this is obviously " + ansbool);//TRUE 
    } else { 
     alert("and then there is " + ansbool);//FALSE 
    } 
}); 
} 

$("#item").on('click', onclick); 

HTML:

<button id="item">Hello, click me.</button> 
1

なぜインクルードは、メソッドが( "偽")決意のinstaed拒否は使用しません。これで、引数としてオブジェクトを渡すことができます。 削除ボタンそれぞれ有する1、あなたが入力の複数のフィールドセットを持っているとしましょう:

function confirmation(question,obj) { 
    var defer = $.Deferred(); 
    $('<div></div>') 
     .html(question) 
     .dialog({ 
      autoOpen: true, 
      modal: true, 
      title: 'Confirmation', 
      buttons: { 
       "Oui": function() { 
        defer.resolve(obj);// pass the object to delete to the defer object 
        $(this).dialog("close"); 
       }, 
       "Non": function() { 
        defer.reject();//reject, no need to pass the object 
        $(this).dialog("close"); 
       } 
      }, 
      close: function() { 

       $(this).dialog('destroy').remove() 
      } 
     }); 
    return defer.promise(); 
} 

$(document).on("click", ".btn-suppr",function(){// all delete buttons having a class btn-suppr 

var question = "Are you sure to delete this fieldset ?"; 
confirmation(question,$(this)).then(function (obj) { 

           obj.parent('fieldset').remove(); // remove the parent fieldset of the delete button if confirmed 

          }); 
         });