有没有办法自动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(); }); }]);