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
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:
$http
no angular$http
solicitação de falha imediata definindo a limitação para offline
nas ferramentas de desenvolvedor do Chrome .$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.
Comentários muito úteis
caso isso ajude alguém. No meu caso, consegui resolver isso definindo
closeOnCancel
e / oucloseOnConfirm
parafalse
. Impedindo assim o fechamento da segunda caixa de alerta. A segunda chamada swal pode defini-los paratrue
.