2012-05-22 15 views
8

Ich versuche einen Ersatz für die Javascript confirm() zu tun. Ich habe die jquery dialog() -Funktion gefunden, die vollständig angepasst werden kann. Das Problem ist, dass ich es nicht zurückgeben kann wahr oder false.jQuery UI Dialog mit boolescher Rückgabe - true oder false

Hier ist mein Code:

$('#delBox').dialog(
     { autoOpen: false, resizable: false, modal: true, closeOnEscape: true, width: 300, height: 'auto', title: 'Deletar registro', 
      buttons: { 
       "Ok": function() { 
        return true; 
       }, "Cancelar": function() { 
        $(this).dialog("close"); 
        return false; 
       } 
      }, 
      open: function() { 
       var buttonsSet = $('.ui-dialog-buttonset').find("button:contains('Ok')"); 
       buttonsSet.attr("class", "ui-button ui-state-default"); 
       $('.ui-dialog-titlebar-close span').empty(); 
       $('.ui-dialog-buttonset').find("button:contains('Ok')").button({ 
        text: false, 
        icons: { 
         primary: 'ui-icon-ok' 
        } 
       }); 

       $('.ui-dialog-buttonset').find("button:contains('Cancelar')").button({ 
        text: false, 
        icons: { 
         primary: 'ui-icon-cancel' 
        } 
       }); 
      } 
     }); 

Dies ist nur ein Objekt zurückgeben, bevor eine Option ausgewählt:

function deletar() { 
    alert($('#delBox').dialog('open')); 
} 

Antwort

27

jQueryUI Dialogfelder zurückkehren kann kein true oder false, wie sie auf dargestellt sind oben von anderem Inhalt, aber ohne blockierende Ausführung.

Das Beste, was Sie tun können, ist:

  1. machen die Box modal so, dass es den anderen Inhalten abhängig verwendet werden

  2. Versorgung Rückrufe versteckt, welche Option gewählt wird.

Für zusätzliche Bonuspunkte könnten Sie ein $.Deferred() Versprechen Objekt erstellen und zurückzugeben, wenn Sie das Dialog zeigen. Sie können dann resolve oder reject, die in der Schaltfläche Ereignishandler versprechen.

Dies würde Ihnen eine saubere Trennung zwischen dem Dialogfeld zeigt, und die Durchführung der Aktionen anschließend durch sie ausgelöst:

function showDialog() { 
    var def = $.Deferred(); 

    // create and/or show the dialog box here 
    // but in "OK" do 'def.resolve()' 
    // and in "cancel" do 'def.reject()' 

    return def.promise(); 
} 

showDialog().done(function() { 
    // they pressed OK 
}).fail(function() { 
    // the pressed Cancel 
}); 

// NB: execution will continue here immediately - you shouldn't do 
//  anything else now - any subsequent operations need to be 
//  started in the above callbacks. 
+1

+1 Für –

+0

Latente denken Sie, die Funktion sollte das vollwertiges Latente Objekt oder eine eingeschränkte Versprechen Schnittstelle über 'return def.promise()' zurückkehren? –

+0

@AtesGoral ja, 'def.Promise()' wäre vorzuziehen - guter Punkt. – Alnitak

7

Die erste Antwort ist in Ordnung - ich dachte, ich würde nur ein Stück Code hinzufügen, zeigt wie Sie auf die Schaltfläche zurück, die angeklickt wurde:

function ShowYesNoMessage(title, message) { 
var def = $.Deferred(); 
$("#infoMessage").html(message); 

$("#dialog_infoMessage").dialog({ 
    modal: true, 
    title: title, 
    buttons: { 
     Yes: function() { 
      $("#infoMessage").html(""); 
      $(this).dialog("close"); 
      def.resolve("Yes"); 
     }, 
     No: function() { 
      $("#infoMessage").html(""); 
      $(this).dialog("close"); 
      def.resolve("No"); 
     } 
    } 
}); 
return def.promise(); 
} 


$.when(ShowYesNoMessage("Are you sure", message)).then(
      function(status) { 
       if (status == "Yes") { 
        //do the next step 
       } 
      } 
     ); 
+1

Persönlich für eine binäre Wahl bevorzuge ich die '.resolve' /' .reject' Kombination. Oh, und es gibt keine Notwendigkeit für ein '$ .when', wenn die Funktion aufgerufen wird innerhalb' $ .when 'gibt ein Versprechen zurück. – Alnitak

+0

Schöne Ergänzung Alnitak - danke –

+0

Dank für die Anzeige kann Wert in Lösung zurückgeben. – QMaster