Angularjs消除模态控制器外的模态

时间:2014-04-18 19:29:29

标签: angularjs modal-dialog

当我从服务中接受承诺时,我试图关闭模式,我无法弄明白:这会导致无法读取未定义的'属性值#39; ....

更改一个plunker的代码,我从angular.iu网站上取了这个plunker,并添加了dismiss行,你可以看到那里的错误

检查控制台

Plunker Modal Dismiss Example

2 个答案:

答案 0 :(得分:2)

在完全实例化并打开模态之前,无法在模态实例上调用

dismiss()。您正在看到的错误发生在ui-bootstrap中,它正在尝试在其内部集合中找到已打开的模态,但它还没有在那里。

open()返回在模态完成打开时解析的承诺...

var modalInstance = $modal.open({ /* ... */ });

modalInstance.opened.then(function () {
    modalInstance.dismiss('dismiss');
});

Plunker

答案 1 :(得分:0)

在角度1.6中,如果你没有正确处理关闭,你会得到一个错误,如“可能未处理的拒绝:未定义”。 $ uibModal.open返回一个promise,如果没有显式定义回调,则会在控制台中弹出错误。在您的情况下,您可能希望在呼叫服务或控制器中正确处理关闭。例如,如果您有一个发出事件的按钮而另一个控制器有一个监听器,那么该监听器应该监视该事件。这是你应该做的:

在模态服务中:

.service('serviceModalName', function ($uibModal) {
      this.open = function () {
           var modalInstance = $uibModal.open({
                templateUrl: '',
                controller: 'serviceNameController'
           });
      };

      modal.result.then(function () {
          modal.dismiss();
      }, angular.noop);

});

在你的其他控制器(在你的应用程序中),再次,我假设模态服务的控制器,其中注入$ uibModalInstance,不会调用关闭或解除功能。相反可以发出一个事件。

.controller('modalController', function ($scope) {
      $scope.close = function () {
          $scope.$emit('modal.closed.somewhere');
      }
});


.controller('someOtherController', function ($scope, serviceModalName) {

      var modalService = serviceModalName.open();

      $scope.$on('modal.closed.somewhere', function (e, args) {
             if (modalService) {
                  modalService.opened.then(function () {
                      modalService.close();
                  }, angular.noop);
             }
      };

});