Hallo,
Ich habe diesen Sweet-Alter-Anruf:
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)
}
});
Im Rückruf sende ich ein Ereignis mit Backbone-Radio.
An diesem Punkt ist alles gut.
Und in meiner Ereignisantwort möchte ich eine weitere süße Warnung wie diese anzeigen:
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",
});
},
Und der zweite süße Alarm erscheint nicht.
Und ich bin sicher, dass die formDeleted-Funktion ausgeführt wird.
Danke für Ihre Hilfe
Könnten Sie versuchen, uns Ihren Code in einer JSFiddle zu zeigen?
Ich habe eine JSFiddle erstellt: http://jsfiddle.net/5pj7wwx9/
Wenn ich auf die Schaltfläche klicke, wird der erste sweetAlert angezeigt, der Rückruf wird aufgerufen, aber der zweite sweetAlert-Nr.
Sie werden in der JSFiddle sehen, die ich mit einem setTimeout ausprobiert habe, es funktioniert nach 2 Sekunden
Ich habe das gleiche Problem. Bereit, alle Informationen bereitzustellen, die zum Sortieren erforderlich sind.
+1 auf die für das Problem erforderliche Lösung
falls dies jemandem hilft. In meinem Fall konnte ich das klären, indem ich closeOnCancel
und / oder closeOnConfirm
auf false
. Dadurch wird das Schließen der zweiten Warnbox verhindert. Der zweite Swal-Anruf kann sie auf true
.
Das ist kein korrektes Verhalten, wir sollten uns nicht darauf verlassen, welchen Wert closeOnCancel und closeOnConfirm haben.
Ich stimme zu, aber es könnte der beabsichtigte Zweck von closeOnConfirm
da dies auch in den Swal-Beispielen dargestellt wird, die eine zweite Box öffnen (http://tristanedwards.me/sweetalert).
Ich stimme immer noch zu, dass es definitiv nicht intuitiv ist.
für mich funktioniert auch das nicht. Sie können sich die Geige ansehen, die ich erstellt habe. https://jsfiddle.net/madhureng/5pj7wwx9/16/
Ich werde mehr als glücklich sein, dass es behoben wird, anstatt dass API eine Entscheidung für mich trifft.
@ maddy2308 - du hast zu viele Klicks. Es funktioniert.
Schauen Sie sich diese Geige an: https://jsfiddle.net/g8j1acv4/
Ich habe nur Ihr erstes document.click herausgenommen und es in document.ready geändert.
Wie @joenorton betont , ist dies das, wofür closeOnConfirm: false
ist. Ich bin damit einverstanden, dass es ein wenig unintuitiv ist. Wenn also jemand eine Lösung für das Problem hat, würde ich sie gerne hinzufügen!
@ maddy2308 , das Problem mit Ihrer Geige ist, dass $('button')
zu mehrdeutig ist, sodass auch die Schaltflächen des Swals aufgerufen werden. Wenn Sie es auch ändern $('body > button')
sollte es funktionieren.
Ich habe auch unter diesem Problem gelitten, und ich glaube, dass dies geändert werden muss.
@ t4t5 Ohne den Quellcode zu betrachten, können wir Folgendes annehmen:
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
Eine einfache Lösung zur Lösung dieses Problems wäre folgende:
<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
Auf diese Weise kann C
eine beliebige Anzahl neuer Dialoge aufrufen, wobei nur sehr wenige Änderungen an der aktuellen Codebasis erforderlich sind.
Ich hatte das gleiche Problem und habe es gelöst, indem ich ein $ timeout für die Bestätigungsaktion hinzugefügt habe (mit Angular).
if (isConfirm){
return $timeout(function() {
// I Use backbone radio event
self.homePageChannel.trigger('deleteForm', self.currentSelectedForm)
}, 100);
}
Dieser Fehler tritt auch bei mir in folgender Situation auf:
$http
-Anforderung für Angular auslöst$http
Anforderung von den Entwicklertools von offline
.$http
einem Fehler von Die erste Bestätigungswarnung wird in Ordnung angezeigt, die Fehlerwarnung jedoch nicht.
Hinweis: Ich habe mich nicht mit dem Code befasst, aber es sieht so aus, als ob die Animation zum Schließen einer vorhandenen süßen Warnung abgebrochen und sofort zerstört werden sollte. Dann wird die zweite Warnung in Ordnung angezeigt.
Bearbeiten: Wie ich erwartet hatte, liegt das Problem bei der ersten Bestätigung der süßen Warnung. Das Setzen von animation
auf false beim ersten Swal stoppt das Problem. Aber es sieht für mich wie ein BUG aus, weil ich möchte, dass die Animation aktiviert wird, falls der Fehler nicht auftritt.
Ich schlage zwei Lösungen vor:
1. Wenn eine zweite Warnung aufgerufen wird, während eine vorhandene Warnung animiert wird, stoppen Sie den Animationsprozess, schließen Sie sofort die aktuelle Warnung und zeigen Sie die neue an.
2. Warteschlange der zweiten Warnung, die geöffnet werden soll, wenn die Animation zum Schließen abgeschlossen ist.
Die 2. Lösung sollte die Dinge reibungsloser machen, während die 1. Lösung den Fehler modal erscheinen lässt!
Ich werde versuchen, eine Pull-Anfrage zu stellen, aber ich habe noch nie zu diesem Projekt beigetragen. Wenn jemand weiß, wo es zu beheben ist, können Sie die Pull-Anfrage zuerst stellen! :) :)
@ t4t5 Bitte Problem beheben!
Sie können querySelectorAll verwenden , es gibt alle Elemente zurück, sodass Sie die zurückgegebenen Werte durchlaufen können
var alertBtn = document.querySelectorAll('.js-alert');
for (var i = 0; i < alertBtn.length; i++) {
alertBtn[i].onclick = function(){
swal({
title: "text",
text: "text text"
});
};
}
Hatte das gleiche Problem mit meinem SweetAlert, wenn der zweite Swal erscheinen sollte, tun sie es nicht, ich bekomme nur einen Fehler in meiner Konsole, der durch das Einfügen eines $ timeout in meine Funktion behoben wurde.
function(error) {
console.log(error);
$timeout(function(){
SweetAlert.error('Erro');
},100) }
Ich hatte das gleiche Problem, aber die Lösung von @PommeVerte hat es gelöst. Ich musste closeOnCancel: false
auf das übergeordnete swal () setzen.
Ab SweetAlert 2.0 werden closeOnConfirm
und closeOnCancel
nicht mehr benötigt, um SweetAlerts zu verketten. Nutze einfach Versprechen ! :) :)
SetTimeout kann das Problem nach dem Rückruf lösen, aber ich möchte mehr über die Ursache des Problems erfahren.
Hilfreichster Kommentar
falls dies jemandem hilft. In meinem Fall konnte ich das klären, indem ich
closeOnCancel
und / odercloseOnConfirm
auffalse
. Dadurch wird das Schließen der zweiten Warnbox verhindert. Der zweite Swal-Anruf kann sie auftrue
.