在控制器加载之前关闭所有 UI bootstrap 路线更改模态 (angularjs)
Close all UI bootstrap modals on route change before controller loads (angularjs)
模态关闭代码(from SO):
$rootScope.$on('$locationChangeStart', x => $uibModalStack.dismissAll("location change dismiss all"));
此侦听器仅在应用 运行 上创建一次,当位置更改时它会正确关闭所有模式。但是,我的问题是它是在从新路由加载控制器后执行的,该路由正在创建模态:
app.controller(..., function(...){
...
dialog.create(template, 'DocumentSearchDialogController', {groups: documentGroups, callback: callback}, 'lg')
(其中 dialog
是 $uibModal
的简单包装器)
因此,模态被创建,然后由侦听器立即关闭。我不想要那样 - 我希望听众在控制器创建模态之前清除模态。
我找到了一个解决方法:将模态创建包装在 $timeout(..., 0)
中会将其延迟到下一个 digest/apply,这发生在控制器和侦听器都执行了所有代码之后。这并不理想 - 我想在初始化控制器之前简单地清除模态,理想情况下,根本不要触摸任何控制器。
编辑:我正在使用 UI-路由器。
事实证明,当使用 UI-Router 时,我使用的监听器不是最优的。事实上,我什至无法阻止我的侦听器中的状态更改。
相反,当使用 UI-Router 时,应该使用 $transitions.onStart()
来监听状态变化。
模态关闭代码(from SO):
$rootScope.$on('$locationChangeStart', x => $uibModalStack.dismissAll("location change dismiss all"));
此侦听器仅在应用 运行 上创建一次,当位置更改时它会正确关闭所有模式。但是,我的问题是它是在从新路由加载控制器后执行的,该路由正在创建模态:
app.controller(..., function(...){
...
dialog.create(template, 'DocumentSearchDialogController', {groups: documentGroups, callback: callback}, 'lg')
(其中 dialog
是 $uibModal
的简单包装器)
因此,模态被创建,然后由侦听器立即关闭。我不想要那样 - 我希望听众在控制器创建模态之前清除模态。
我找到了一个解决方法:将模态创建包装在 $timeout(..., 0)
中会将其延迟到下一个 digest/apply,这发生在控制器和侦听器都执行了所有代码之后。这并不理想 - 我想在初始化控制器之前简单地清除模态,理想情况下,根本不要触摸任何控制器。
编辑:我正在使用 UI-路由器。
事实证明,当使用 UI-Router 时,我使用的监听器不是最优的。事实上,我什至无法阻止我的侦听器中的状态更改。
相反,当使用 UI-Router 时,应该使用 $transitions.onStart()
来监听状态变化。