2012-05-22 23 views
8

Estoy tratando de hacer un reemplazo para el javascript confirm(). Encontré la función de diálogo jquery() que se puede personalizar por completo. El problema es que no puedo devolver verdadero o falso.jQuery IU diálogo con retorno booleano - verdadero o falso

Aquí está mi código:

$('#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' 
        } 
       }); 
      } 
     }); 

Esto sólo devolver un objeto antes de que cualquier opción seleccionada:

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

Respuesta

27

cuadros de diálogo jQueryUI no pueden devolver un true o false a medida que se muestran en parte superior de otro contenido pero sin bloqueando la ejecución.

Lo mejor que puede hacer es:

  1. hacer la caja modal de modo que oculta el contenido de otra

  2. devoluciones de llamada de suministro para ser utilizado en función de la opción elegida.

Para los puntos de bonificación extra, se puede crear un objeto de la promesa $.Deferred() y volver que cuando se presenta el cuadro de diálogo. Puede entonces resolve o reject que prometen en los manejadores de eventos de botón.

Esto le daría una separación limpia entre mostrar el cuadro de diálogo, y la realización de las acciones posteriormente provocados por ella:

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 Para diferido –

+0

¿cree que la función debe devolver el objeto diferido de pleno derecho o una interfaz Promise restringida a través de 'def.promise retorno()'? –

+0

@AtesGoral sí, 'def.promise()' sería preferible, buen punto. – Alnitak

7

La primera respuesta es bien - pensé que acababa de añadir un poco de código que muestran cómo se puede devolver el botón que se haga clic:

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

Personalmente para una opción binaria, prefiero la combinación '.resolve' /' .reject' Oh, y no hay necesidad de un '$ .when' si la función se llama dentro de' $ .when' devuelve una promesa. – Alnitak

+0

Agradable además Alnitak - gracias –

+0

Gracias por mostrar puede devolver el valor dentro de la resolución. – QMaster

Cuestiones relacionadas