2012-12-07 20 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 
    } 

Witam wszystkich, masz szansę zwrócić wartość? Chcę zwrócić true i false poprzez showDialog(). Done() i nie działa funkcja validatefield(), ale to nie działa tak, jak chcę, nie mogę przypisać do bAllow, ponieważ miałem już zwrot false do zawieszenia okno dialogowe, aby wykonać kolejną linię, jakiś pomysł? A może tak jest?jQuery Odroczone i okno dialogowe

+0

nie będziesz w stanie spowodować Javascript czekać na zakończenie odroczonego obiektu, więc nie ma sposobu, aby 'powrót 'później. Nie jestem pewien, jak to "naprawić", ale myślę, że sposób na reorganizację kodu/logiki – Ian

+0

Nie, nie można zwrócić synchronicznie z asynchronicznego zadania. Zamiast tego przekaż odroczone! – Bergi

+0

oznacza więc, że przechodzę do innej funkcji, n używać innej funkcji do sprawdzania sprawdzania poprawności zamiast tej samej funkcji? Czy mogę pokazać mi jakiś właściwy sposób na zrobienie tego? utwórz zmienną globalną, ustaw ją na true/fase na podstawie defferend, następnie w innej funkcji użyj zmiennej globalnej do sprawdzania, po czym użyj funkcji, aby zwrócić true/false?Nadal jestem nowicjuszem, po prostu przeszukuję google n to rozwiążę, wyjdź coś takiego – Se0ng11

Odpowiedz

27

Cóż, to może zadziałać.

Twoja funkcja dialogowe ... 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(); 
} 

a następnie kod gdzie użyć funkcji ...

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 
     } 
    }); 
} 

To może wydawać się źle dla większości ludzi. Ale zawsze są sytuacje, w których po prostu nie można przejść bez powrotu z JQuery Dialog.

Będzie to zasadniczo naśladować funkcję confirm(). Ale z brzydkim kodem i miłym potwierdzeniem wyglądu boxa :)

Mam nadzieję, że pomoże to niektórym osobom.


EDIT: Bootstrap 3 Rozwiązanie


Jestem teraz używając NakuPanda's startowej biblioteki, to działa bardzo dobrze. Zasadniczo to samo, co w przypadku JQueryUI, ale w interfejsie Bootstrap.

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(); 
      } 
     }] 
    }); 
} 

i używając go (dość dużo w ten sam sposób)

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

Wiele razy stosowałem podobne podejście. Uwaga: Twój kod pozostawi skonfigurowany '

' w DOM - potrzebujesz '$ (this) .dialog ('destroy'). Remove()' w instrukcji obsługi 'close' okna dialogowego. – Alnitak

+0

@Pierre: Czy muszę dodać dodatkową bibliotekę dla Odroczonego i obiecuję działać? – ChandniShah

+0

@ChandniShah Tylko Jquery 1.5+ jest funkcją wbudowaną. Aby uzyskać więcej informacji, zobacz 'https: // api.jquery.com/category/deferred-object /' – Pierre

4

Stworzyłem this JSFIDDLE i zmienił boolean parse ponieważ wiał w górę. Dzięki, Pierre! To zaoszczędziło mi dużo czasu.

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

dlaczego nie użyć odrzucić metodę instaed determinacji ("false"). Będziesz wtedy mógł przekazać obiekt jako argument. Powiedzmy masz kilka fieldsets wejść, każdy mający przycisk Usuń:

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 

          }); 
         });