有没有办法自动closuresAngular UI Bootstrap模式路线更改?

我已经在模块内的模板链接。 当我点击它们时,当前页面会改变,但覆盖和模式停留。 我可以将ng-click="dimiss()"到模态中所有模板中的每个链接,但有没有更好的方法? 例如,在成功路由更改时自动closures它,或者每个模板只添加一个ng-click来处理所有的链接?

如果您希望所有打开的模式在路由成功更改时closures,您可以通过监听$routeChangeSuccess事件(例如在应用的运行模块中)在一个中心位置执行此操作:

 var myApp = angular.module('app', []).run(function($rootScope, $uibModalStack) { $uibModalStack.dismissAll(); }); 

在这里你可以看到$uibModalStack服务被注入,你可以调用dismissAll方法 – 这个调用将closures所有当前打开的模式。

所以,是的,你可以在一个地方用一行代码来处理集中closures的模式:-)

一个更好的方法是,无论何时打开Popup(Modal),在浏览器后退button(或键盘后退)上,我们停止URL更改并closurespopup窗口。 这有助于在我的项目中获得更好的用户体验。

如果没有Modal打开,则“浏览器后退”button正常工作。

使用:

 $uibModalStack.dismiss(openedModal.key); 

要么

 $uibModalStack.dismissAll; 

示例代码:

 .run(['$rootScope', '$uibModalStack', function ($rootScope, $uibModalStack) { // close the opened modal on location change. $rootScope.$on('$locationChangeStart', function ($event) { var openedModal = $uibModalStack.getTop(); if (openedModal) { if (!!$event.preventDefault) { $event.preventDefault(); } if (!!$event.stopPropagation) { $event.stopPropagation(); } $uibModalStack.dismiss(openedModal.key); } }); }]); 

我实际上并没有使用Angular UI Bootstrap,而是从文档看来,它看起来像$modalInstance对象上有一个close()方法。

所以以文档为例,这应该工作:

 var ModalInstanceCtrl = function ($scope, $modalInstance, items) { $scope.items = items; $scope.selected = { item: $scope.items[0] }; $scope.ok = function () { $modalInstance.close($scope.selected.item); }; $scope.cancel = function () { $modalInstance.dismiss('cancel'); }; // this will listen for route changes and call the callback $scope.$on('$routeChangeStart', function(){ $modalInstance.close(); }); }; 

希望有所帮助。

我通过这样做解决了这个问题:

 $rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams){ $modalStack.dismissAll(); }); 

我将这个逻辑保存在模态控制器中。 您可以听取$locationChangeStart事件并closures模式。 在删除监听器之后,特别是在$rootScope上注册一个监听器也是一件好事:

 angular.module('MainApp').controller('ModalCtrl',['$scope','$uibModalInstance', function ($scope, $uibModalInstance) { var dismissModalListener = $scope.$on('$locationChangeStart', function () { $uibModalInstance.close(); }); $scope.$on('$destroy', function() { dismissModalListener(); }); }]);