如何从任何地方关闭 Angular UI Modal

Posted

技术标签:

【中文标题】如何从任何地方关闭 Angular UI Modal【英文标题】:How to close Angular UI Modal from anywhere 【发布时间】:2014-10-16 05:52:28 【问题描述】:

我正在使用Angular UI bootstrap modal dialog 并在服务中创建它:

myApp.factory('ModalService', ['$modal', function($modal) 
    return 
        trigger: function(template) 
            $modal.open(
                templateUrl: template,
                size: 'lg',
                controller: function($scope, $modalInstance) 
                    $scope.ok = function() 
                        $modalInstance.close($scope.selected.item);
                    ;
                    $scope.cancel = function() 
                        $modalInstance.dismiss('cancel');
                    ;
                
            );
        ,
        close: function() 
            // this should close all modal instances
        
    ;
]);

从控制器或其他任何方式调用 ModalService.close() 时,如何关闭所有模式实例?

【问题讨论】:

我非常感谢这篇文章。我能够通过它重构我的代码。唯一的区别是我确实使用了类似于文档的解析方法来获取我正在更新的数据。 【参考方案1】:

注入$modalStack服务并调用函数$modalStack.dismissAll(),详见GitHub上的代码:

myApp.factory('ModalService', ['$modal', '$modalStack' function($modal, $modalStack) 
    return 
        trigger: function(template) 
            $modal.open(
                templateUrl: template,
                size: 'lg',
                controller: function($scope, $modalInstance) 
                    $scope.ok = function() 
                        $modalInstance.close($scope.selected.item);
                    ;
                    $scope.cancel = function() 
                        $modalInstance.dismiss('cancel');
                    ;
                
            );
        ,
        close: function(reason) 
            $modalStack.dismissAll(reason);
        
    ;
]);

【讨论】:

谢谢,就像一个魅力!我不知道为什么文档中没有提到这一点github.com/angular-ui/bootstrap/tree/master/src/modal/docs @DonJuwe 同意,这会很有帮助,就像在 $http 成功关闭模式时一样。 非常感谢,他们的帮助非常重要。 +1 =) 太棒了。它也适用于 AngularUI,只需使用 $uibModalStack 在函数参数中添加逗号【参考方案2】:

我添加了以下行以防止浏览器后退按钮路由和关闭弹出窗口。我们需要将 $modalStack 注入到角度控制器中。

event.preventDefault();
            $modalStack.dismissAll('close');

【讨论】:

【参考方案3】:

这就是我在不使用任何工厂或其他代码的情况下让它在我的项目中工作的方式。

  //hide any open $mdDialog modals
  angular.element('.modal-dialog').hide();
  //hide any open bootstrap modals
  angular.element('.inmodal').hide();
  //hide any sweet alert modals
  angular.element('.sweet-alert').hide();

我有一个超时功能,它以$rootScope.$emit('logout'); 发出注销,我的服务中的侦听器如下:

$rootScope.$on('logout', function () 
                    //hide any open $mdDialog modals
                    angular.element('.modal-dialog').hide();
                    //hide any open bootstrap modals
                    angular.element('.inmodal').hide();
                    //hide any sweet alert modals
                    angular.element('.sweet-alert').hide();

                    //do something else here  

                );

我不知道这是否是正确的方法,但它对我有用。

【讨论】:

以上是关于如何从任何地方关闭 Angular UI Modal的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 angular-ui 模态关闭?

带有 Razor 页面的 ASP .Net Core 与 UI 的 Angular [关闭]

使用 SCSS / CSS 进行目标 Angular 绑定

单击外部时隐藏Angular UI Bootstrap弹出窗口

Angular-Ui-Calendar:如何在单个日历中显示两个agendaWeekView

使用 Angular 复制带有 UI 和所选值的下拉列表