Как обращаться с "Возможно необработанным отказом: обратный клик" в общем виде

У меня есть служба angular для обработки модалов:

angular.module('myApp').service('ModalService', function($uibModal) {
  function open(options) {
    return $uibModal.open(options);
  }
});

Теперь я обновился до angular 1.6 и получил эту ошибку:

Возможно необработанное отклонение: фоновый клик

всякий раз, когда я открываю модальный файл и нажимаю в другом месте (фон), а модальный закрывается (как и предполагалось). Поэтому я хочу обрабатывать этот unhandled exception в моем ModalService, так как я не хочу обрабатывать этот случай каждый раз, когда я использую ModalService. Это всегда нормально закрыть модальный с помощью фонового щелчка, это не исключение.

Я пробовал:

angular.module('myApp').service('ModalService', function($uibModal) {
  function open(options) {
    var modalInstance = $uibModal.open(options);
    modalInstance.result.catch(function error(error) {
      if(error === "backdrop click") {
        // do nothing
      } else {
        throw error;
      }
    })
    return modalInstance;
  }
});

Но это приводит к тому, что я не могу обрабатывать другие ошибки, чем backdrop click, поскольку они всегда выбрасываются:

ModalService.open({...}).result.catch(function(error) {
  // this will catch the error too, but the throw in the ModalService
  // will occure in parallel and will not be catched by this function
});

И если я попробую это вот так:

angular.module('myApp').service('ModalService', function($uibModal) {
  function open(options) {
    var modalInstance = $uibModal.open(options);
    modalInstance.result.then(function(whatever) {
      return whatever;
    }, function rejection(error) {
      return error;
    });
    return modalInstance;
  });
});

он разрешает ошибку "необработанное отклонение", но для каждого случая не только для "фонового клика".

Есть ли у кого-нибудь хорошее решение для этого случая?

Ответы

Ответ 1

К сожалению, как они справляются с этим в Официальный Plucker for Modal (ui.bootstrap.modal).

Если вы нажмете на любую кнопку, он зарегистрирует что-то вроде этого:

Модаль уволен в: чт 23 февраля 2017 21:54:26 GMT-0300 (Pacific SA Daylight Time)

Что они делают:

modalInstance.result.then(function (selectedItem) {
  $ctrl.selected = selectedItem;
}, function () {
  $log.info('Modal dismissed at: ' + new Date());
});

Если вы удалите обратный вызов ошибки, угадайте, что вы получите:

Возможно необработанное отклонение: фоновый клик

И даже при отмене

Возможно необработанное отклонение: отменить

До сих пор вы либо делаете это, либо используете это обходное решение, чтобы отключить необработанные отклонения

app.config(['$qProvider', function ($qProvider) {
            $qProvider.errorOnUnhandledRejections(false);
        }]);

Ответ 2

используйте этот

 $uibModal.open({
                    ////your code......
}).result.then(function(){}, function(res){})

теперь он не даст вам ошибки

Ответ 3

Зависимость от пользовательского интерфейса.

Это НЕ самое большое обходное решение, если существуют спецификации пользовательского интерфейса, которые конечный пользователь должен иметь возможность нажимать на ВНЕЗАПНЫЙ модальный, чтобы закрыть модальный.

Если это не так, и в правом верхнем углу мода есть немного "х" и/или есть закрытие

backdrop: false,//< < <!!!!!!! (см. код ниже)
будет препятствовать тому, чтобы конечный пользователь нажал OUTSIDE modal, чтобы закрыть модальный.

$scope.change = function (changeableData, p_Mode) {
    var modalInstance = $uibModal.open({
        templateUrl: whatever,
        controller: ModalInstanceCtrl,
        scope: $scope,
        backdrop: false,  // <<< !!!!!!!
        resolve: {
            // whatever
        }
    });  

Это предотвратит появление ошибки "Возможно необработанное отклонение: обратный клик".

Еще раз, вам нужно посмотреть спецификации пользовательского интерфейса и/или получить разрешение от аналитиков для реализации этого.

Ответ 4

Если вы используете контроллер в своем модальном режиме. Я использовал это на закрытии. Потому что "Закрытие" действительно, но "Отклонение" является отказом. Это касается вашего модального контроллера, а не родителя.

            $scope.$on('modal.closing', (event, reason, closed) => {
                if (!closed) {
                    event.preventDefault();
                    $scope.$close("Closing");   
                }

            });

Таким образом, ваш фоновый клик убьет событие закрытия, но закрытое будет передано false. Если это так, предотвратите поведение по умолчанию и программным образом закрывайте модальный режим вместо увольнения. Не важно, что это нарушит использование увольнения, если вы хотите использовать его для своей первоначальной цели.