Sweetalert: Вторая ласточка не выполнена

Созданный на 15 янв. 2015  ·  19Комментарии  ·  Источник: t4t5/sweetalert

Здравствуйте,

У меня такой призыв к сладкому:

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

В обратном вызове я отправляю событие с магистральным радио.
На данный момент все хорошо.

И в моем ответе на событие я хочу отобразить еще одно приятное предупреждение, подобное этому:

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

И второе сладкое оповещение не появляется.
И я уверен, что функция formDeleted выполняется.

Спасибо за вашу помощь

Самый полезный комментарий

если это кому-нибудь поможет. В моем случае я смог разобраться в этом, установив closeOnCancel и / или closeOnConfirm на false . Таким образом предотвращается закрытие второго окна предупреждения. Второй вызов swal может установить их на true .

Все 19 Комментарий

Не могли бы вы показать нам свой код в JSFiddle?

Я создал JSFiddle: http://jsfiddle.net/5pj7wwx9/

Когда я нажимаю на кнопку, отображается первое sweetAlert, вызывается обратный вызов, а второго sweetAlert нет.

Вы увидите в JSFiddle, который я пробовал с помощью setTimeout, он работает через 2 секунды

У меня такая же проблема. Готовы предоставить любую информацию, необходимую для сортировки этого.

+1 к решению, необходимому для проблемы

если это кому-нибудь поможет. В моем случае я смог разобраться в этом, установив closeOnCancel и / или closeOnConfirm на false . Таким образом предотвращается закрытие второго окна предупреждения. Второй вызов swal может установить их на true .

Это неправильное поведение, мы не должны зависеть от значений closeOnCancel и closeOnConfirm.

Я согласен, но это может быть предполагаемая цель closeOnConfirm поскольку именно так он изображен в примерах ласточки, которые открывают второй ящик (http://tristanedwards.me/sweetalert)
Я все еще согласен, что это определенно не интуитивно понятно.

для меня даже это не работает. Вы можете взглянуть на созданную мной скрипку. https://jsfiddle.net/madhureng/5pj7wwx9/16/

Я буду более чем счастлив, что он будет исправлен, а не api примет решение за меня.

@ maddy2308 - у вас слишком много кликов. Это действительно работает.
Посмотрите на эту скрипку: https://jsfiddle.net/g8j1acv4/

Единственное, что я изменил, - это вынул ваш первый document.click и изменил его на document.ready.

Как отмечает @joenorton , это то, для чего closeOnConfirm: false . Я согласен с тем, что это немного неинтуитивно, поэтому, если у кого-то есть решение проблемы, я был бы рад добавить его!

@ maddy2308 , проблема с вашей скрипкой в ​​том, что $('button') слишком неоднозначно, поэтому кнопки ласточки также вызываются. Если вы измените его тоже $('body > button') он должен работать.

Я тоже страдал от этой проблемы, и я считаю, что это нужно изменить.

@ t4t5 Не глядя на исходный код, мы можем предположить следующее:

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

Простым решением этой проблемы было бы следующее:

<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

Это позволит C вызывать любое количество новых диалогов с минимальными изменениями, необходимыми для текущей кодовой базы.

У меня была такая же проблема, я решил ее, добавив тайм-аут $ для действия подтверждения (с Angular)
if (isConfirm){ return $timeout(function() { // I Use backbone radio event self.homePageChannel.trigger('deleteForm', self.currentSelectedForm) }, 100); }

Эта ошибка возникает и у меня в следующей ситуации:

  1. Вызовите сладкое уведомление с подтверждением, которое запускает запрос $http на angular
  2. Принудительно вызвать немедленный сбой запроса $http , установив регулировку на offline в инструментах разработчика Chrome .
  3. Вызов сообщения об ошибке при ошибке $http .

Первое подтверждающее предупреждение будет отображаться нормально, но предупреждение об ошибке не появится.

Примечание: я не углублялся в код, но похоже, что анимация закрытия любого существующего сладкого предупреждения должна быть отменена и должна быть немедленно уничтожена, тогда второе предупреждение будет отображаться нормально.


Изменить: Как я и ожидал, проблема связана с первым сладким подтверждением предупреждения. Установка animation на false при первом проглатывании решает проблему. Но для меня это похоже на ОШИБКУ, потому что я могу захотеть, чтобы анимация была включена, если ошибка не возникает.

Предлагаю два решения:

1-й: если второе предупреждение вызывается во время выключения существующего предупреждения, остановите процесс анимации, немедленно закройте текущее предупреждение и покажите новое.

2-й: поставить в очередь второе предупреждение, которое будет открыто после завершения анимации закрытия.

Второе решение должно упростить работу, а первое решение ускорит отображение модального окна ошибки!

Я попытаюсь сделать пул-реквест, но я никогда раньше не участвовал в этом проекте. Если кто-то знает, где исправить, не стесняйтесь сначала сделать пул-реквест! :)

@ t4t5 Пожалуйста, ознакомьтесь с моим отчетом и решениями, если вы одобряете, я могу исправить!

Вы можете использовать querySelectorAll , он возвращает все элементы, поэтому вы можете перебирать возвращаемые значения

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

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

У меня была такая же проблема с моим SweetAlert, когда должен появиться второй глоток, их нет, я просто получаю ошибку в моей консоли, решаемую включением тайм-аута $ в мою функцию.

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

У меня была такая же проблема, но решение @PommeVerte решило ее. Мне нужно было установить closeOnCancel: false в родительский swal ().

Начиная с SweetAlert 2.0, closeOnConfirm и closeOnCancel больше не нужны для связывания SweetAlerts. Просто используйте обещания ! :)

SetTimeout может решить проблему после обратного вызова, но я хотел бы узнать больше о причине проблемы.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги