Sweetalert: Segundo trago no ejecutado

Creado en 15 ene. 2015  ·  19Comentarios  ·  Fuente: t4t5/sweetalert

Hola,

Tengo esta dulce llamada:

var self = this; 

swal({
      title              : $.t('modal.clear.title') || "Etes vous sûr ?",
      text               : $.t('modal.clear.text') || "Le formulaire sera définitivement perdu !",
      type               : "warning",
      showCancelButton   : true,
      confirmButtonColor : "#DD6B55",
      confirmButtonText  : $.t('modal.clear.yes') || "Oui, supprimer",
      cancelButtonText   : $.t('modal.clear.no') || "Annuler",
      closeOnCancel      : true
}, function(isConfirm) {
   if (isConfirm){
       // I Use backbone radio event
       self.homePageChannel.trigger('deleteForm', self.currentSelectedForm)
   }
});

En la devolución de llamada envío un evento con radio troncal.
En este punto todo está bien.

Y en mi respuesta de evento, quiero mostrar otra alerta dulce como esta:

formDeleted : function(result) {
        swal({
            title : $.t('modal.deleted.title') || 'Formulaire supprimé !',
            text  : $.t('modal.deleted.text') || 'Votre formulaire a été supprimé avec succès',
            type  : "success",
        });
  },

Y la segunda dulce alerta no aparece.
Y estoy seguro de que se ejecuta la función formDeleted.

Gracias por tu ayuda

bug

Comentario más útil

en caso de que esto ayude a alguien. En mi caso, pude solucionar esto configurando closeOnCancel y / o closeOnConfirm en false . Evitando así el cierre del segundo cuadro de alerta. La segunda llamada de tragar puede establecerlos en true .

Todos 19 comentarios

¿Podría intentar mostrarnos su código en un JSFiddle?

Creé un JSFiddle: http://jsfiddle.net/5pj7wwx9/

Cuando hago clic en el botón, se muestra el primer sweetAlert, se llama a la devolución de llamada, pero el segundo sweetAlert no.

Verá en JSFiddle que probé con un setTimeout, funciona después de 2 segundos

Tengo el mismo problema. Dispuesto a proporcionar cualquier información necesaria para solucionar este problema.

+1 a la resolución requerida para el problema

en caso de que esto ayude a alguien. En mi caso, pude solucionar esto configurando closeOnCancel y / o closeOnConfirm en false . Evitando así el cierre del segundo cuadro de alerta. La segunda llamada de tragar puede establecerlos en true .

Ese no es un comportamiento correcto, no deberíamos depender de cuál es el valor de closeOnCancel y closeOnConfirm.

Estoy de acuerdo, pero podría ser el propósito previsto de closeOnConfirm ya que así es como se muestra en los ejemplos de gol que abren un segundo cuadro (http://tristanedwards.me/sweetalert)
Todavía estoy de acuerdo en que definitivamente no es intuitivo.

para mí incluso eso no funciona. Puedes echar un vistazo al violín que creé. https://jsfiddle.net/madhureng/5pj7wwx9/16/

Estaré más que feliz de que se solucione en lugar de que api tome una decisión por mí.

@ maddy2308 : tienes demasiados clics en curso. Funciona.
Mira este violín: https://jsfiddle.net/g8j1acv4/

Lo único que cambié fue que saqué su primer document.click y lo cambié a document.ready.

Como señala @joenorton , para esto es closeOnConfirm: false . Sin embargo, estoy de acuerdo en que es un poco poco intuitivo, así que si alguien tiene una solución al problema, ¡me complacerá agregarla!

@ maddy2308 , el problema con tu violín es que $('button') es demasiado ambiguo, por lo que también se invocan los botones de gol. Si lo cambia también $('body > button') debería funcionar.

Yo también sufrí este problema y creo que es necesario cambiarlo.

@ t4t5 Sin mirar el código fuente, podemos asumir lo siguiente:

the first swal is shown at point A in time
the user interacts with the first swal at point B in time
the callback is called and invokes the second swal at point C in time
the active swal is dismissed at point D in time

Una solución fácil para resolver este problema sería la siguiente:

<strong i="11">@A</strong>: An integer variable is set that increases with every call to swal
<strong i="12">@B</strong>: The current value of the variable is remembered
<strong i="13">@D</strong>: If the variable has changed, do not call swal.close

Esto permitirá que C invoque cualquier cantidad de nuevos diálogos, con muy poca modificación necesaria para el código base actual.

Tuve el mismo problema, lo resolví agregando un $ timeout en la acción de confirmación (con Angular)
if (isConfirm){ return $timeout(function() { // I Use backbone radio event self.homePageChannel.trigger('deleteForm', self.currentSelectedForm) }, 100); }

Este error también ocurre conmigo en la siguiente situación:

  1. Llame a una alerta dulce de confirmación que desencadena una solicitud $http en angular
  2. Forzar la solicitud de $http resolver la falla configurando la limitación en offline en las herramientas de desarrollo de Chrome .
  3. Llame a una alerta dulce de error en $http failure.

La primera alerta de confirmación se verá bien, pero la alerta de error no se mostrará.

Nota: No me sumergí en el código, pero parece que la animación de cierre de cualquier alerta dulce existente debería cancelarse y debería destruirse inmediatamente, luego la segunda alerta se mostrará bien.


Editar: Como esperaba, el problema está en la primera confirmación de alerta dulce. Establecer animation en falso en el primer trago detiene el problema. Pero me parece un ERROR, porque es posible que desee que la animación esté habilitada en caso de que el error no se produzca.

Propongo dos soluciones:

1º: Si se llama a una segunda alerta mientras se está desactivando una alerta existente, detenga el proceso de animación, cierre inmediatamente la alerta actual y muestre la nueva.

2º: Ponga en cola la segunda alerta que se abrirá cuando finalice la animación de cierre.

La segunda solución debería hacer las cosas más suaves, mientras que la primera solución hace que el modo de error aparezca más rápido.

Intentaré hacer una solicitud de extracción, pero nunca antes contribuí en este proyecto, si alguien sabe dónde arreglarlo, ¡no dudes en hacer la solicitud de extracción primero! :)

@ t4t5 Por favor, eche un vistazo a mi informe y mis soluciones. Si lo aprueba, ¡puedo solucionarlo!

Puede usar querySelectorAll , devuelve todos los elementos, por lo que puede recorrer los valores devueltos

var alertBtn = document.querySelectorAll('.js-alert');

for (var i = 0; i < alertBtn.length; i++) {
    alertBtn[i].onclick = function(){
        swal({
            title: "text",
            text: "text text"
            });
    };
}

Tuve el mismo problema con mi SweetAlert, cuando debería aparecer el segundo gol, no aparece, solo aparece un error en mi consola, resuelto al incluir un tiempo de espera $ en mi función.

function(error) { console.log(error); $timeout(function(){ SweetAlert.error('Erro'); },100) }

Tuve el mismo problema pero la solución de @PommeVerte lo resolvió. Necesitaba establecer closeOnCancel: false en el objeto principal swal ().

A partir de SweetAlert 2.0, closeOnConfirm y closeOnCancel ya no son necesarios para encadenar SweetAlerts. ¡Solo usa promesas ! :)

SetTimeout puede resolver el problema después de la devolución de llamada, pero me gustaría saber más sobre la causa del problema.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

Untit1ed picture Untit1ed  ·  5Comentarios

jamieson99 picture jamieson99  ·  3Comentarios

voodoo6 picture voodoo6  ·  4Comentarios

fracz picture fracz  ·  4Comentarios

Lusitaniae picture Lusitaniae  ·  4Comentarios