Sweetalert: Segundo swal não executado

Criado em 15 jan. 2015  ·  19Comentários  ·  Fonte: t4t5/sweetalert

Olá,

Tenho esta ligação doce-alter:

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

No callback mando um evento com rádio backbone.
Neste ponto, tudo está bem.

E na minha resposta ao evento, quero exibir um outro alerta doce como este:

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

E o segundo doce alerta não aparece.
E tenho certeza de que a função formDeleted foi executada.

Obrigado pela ajuda

bug

Comentários muito úteis

caso isso ajude alguém. No meu caso, consegui resolver isso definindo closeOnCancel e / ou closeOnConfirm para false . Impedindo assim o fechamento da segunda caixa de alerta. A segunda chamada swal pode defini-los para true .

Todos 19 comentários

Você poderia tentar nos mostrar seu código em um JSFiddle?

Criei um JSFiddle: http://jsfiddle.net/5pj7wwx9/

Quando clico no botão, o primeiro sweetAlert é mostrado, o retorno de chamada é chamado, mas o segundo sweetAlert não.

Você verá no JSFiddle que tentei com um setTimeout, ele funciona após 2 segundos

Estou tendo o mesmo problema. Disposto a fornecer todas as informações necessárias para resolver isso.

+1 para a resolução necessária para o problema

caso isso ajude alguém. No meu caso, consegui resolver isso definindo closeOnCancel e / ou closeOnConfirm para false . Impedindo assim o fechamento da segunda caixa de alerta. A segunda chamada swal pode defini-los para true .

Esse não é um comportamento correto, não devemos depender de qual é o valor de closeOnCancel e closeOnConfirm.

Eu concordo, mas pode ser o propósito pretendido de closeOnConfirm já que também é assim que é retratado nos exemplos de swal que abrem uma segunda caixa (http://tristanedwards.me/sweetalert)
Ainda concordo que é definitivamente não intuitivo.

para mim mesmo isso não está funcionando. Você pode dar uma olhada no violino que criei. https://jsfiddle.net/madhureng/5pj7wwx9/16/

Ficarei mais do que feliz se isso for corrigido, em vez de a api tomar decisões por mim

@ maddy2308 - você tem muitos cliques acontecendo. Funciona.
Confira este violino: https://jsfiddle.net/g8j1acv4/

A única coisa que mudei foi tirar seu primeiro document.click e alterá-lo para document.ready.

Como @joenorton aponta, é para isso que serve closeOnConfirm: false . Eu concordo que não é um pouco intuitivo, então, se alguém tiver uma solução para o problema, ficarei feliz em adicioná-la!

@ maddy2308 , o problema com seu violino é que $('button') é muito ambíguo, então os botões do swal também são invocados. Se você alterá-lo também $('body > button') ele deve funcionar.

Eu também sofri com esse problema e acredito que isso precisa ser mudado.

@ t4t5 Sem olhar para o código-fonte, podemos assumir o seguinte:

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

Uma solução fácil para resolver esse problema seria a seguinte:

<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

Isso permitirá que C invoque qualquer quantidade de novos diálogos, com muito pouca modificação necessária para a base de código atual.

Eu tive o mesmo problema, resolvi-o adicionando um $ timeout na ação de confirmação (com Angular)
if (isConfirm){ return $timeout(function() { // I Use backbone radio event self.homePageChannel.trigger('deleteForm', self.currentSelectedForm) }, 100); }

Este bug ocorre comigo também na seguinte situação:

  1. Chame um alerta de confirmação que dispara uma solicitação $http no angular
  2. Forçar $http solicitação de falha imediata definindo a limitação para offline nas ferramentas de desenvolvedor do Chrome .
  3. Chame um alerta de erro doce em falha de $http .

O primeiro alerta de confirmação será exibido corretamente, mas o alerta de erro não será exibido.

Nota: Eu não mergulhei no código, mas parece que a animação de fechamento em qualquer alerta doce existente deve ser cancelada e deve ser imediatamente destruída, então o segundo alerta será exibido corretamente.


Edit: Como eu esperava, o problema é com a primeira confirmação de alerta doce. Definir animation como falso na primeira tentativa interrompe o problema. Mas parece um BUG para mim, pois posso querer a animação habilitada caso o erro não ocorra.

Proponho duas soluções:

1º: Se um segundo alerta for acionado enquanto um alerta existente estiver sendo animado, pare o processo de animação, feche imediatamente o alerta atual e mostre o novo.

2º: Coloque o segundo alerta na fila para ser aberto quando a animação de fechamento terminar.

A 2ª solução deve tornar as coisas mais suaves, enquanto a 1ª solução faz com que o modal do erro apareça mais rápido!

Vou tentar fazer um pull request, mas nunca contribuí neste projeto antes, se alguém souber onde consertar, fique à vontade para fazer o pull request primeiro! :)

@ t4t5 Por favor, dê uma olhada em meu relatório e soluções, se você aprovar eu posso fazer a correção!

Você pode usar querySelectorAll , ele retorna todos os elementos, então você pode fazer loop sobre os valores retornados

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

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

Tive o mesmo problema com meu SweetAlert, quando o segundo swal deveria aparecer, eles não aparecem, apenas recebo um erro no meu console, resolvido incluindo um $ timeout em minha função.

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

Tive o mesmo problema mas a solução de @PommeVerte resolveu. Eu precisava definir closeOnCancel: false para o pai swal ().

A partir do SweetAlert 2.0, closeOnConfirm e closeOnCancel não são mais necessários para encadear SweetAlerts. Basta usar promessas ! :)

SetTimeout pode resolver o problema após o retorno de chamada, mas eu gostaria de saber mais sobre a causa do problema.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

Untit1ed picture Untit1ed  ·  5Comentários

voodoo6 picture voodoo6  ·  4Comentários

rafatux picture rafatux  ·  5Comentários

mateuszjarzewski picture mateuszjarzewski  ·  4Comentários

mouro001 picture mouro001  ·  3Comentários