我正在寻找一种方法来取消Angular-UI Bootstrap模式的解析并阻止它打开。 dismissAll 方法无效,因为仅在解析完成后才将模态实例添加到模式堆栈。
我有一个网站,其中模式在路线更改时打开和关闭。如果在路线更改期间调用 dismissAll 以关闭任何旧模态,则不会影响仍在解析的模态。所以你来到新的路线,但旧的模态仍然在它的决心完成后弹出。
答案 0 :(得分:0)
目前看来,没有办法取消ES6和$ q承诺。您可以参考this question了解更多信息。
tl; dr Bluebird allows promise cancellation
如果你真的需要它,你可以add bluebird to angular。
如果你仍然想使用普通的'$ q,这就是我要做的事情
ui-router
)或路由(如果使用angular router
)。 modalInstance
对象公开了一个rendered
承诺,该承诺将在模态完成渲染时运行,您可以将$uibModalStack.dismissAll();
放入其中。
示例:强>
modalInstance.rendered.then(function (currentState) {
if (currentState !== $state.current) {
$uibModalStack.dismissAll();
}
}, function () {
$log.info('Modal dismissed at: ' + new Date());
});
当然,您可以在渲染模态后推迟加载并完全避免这种混乱。
答案 1 :(得分:0)
这是迄今为止确保模态永远不会消失的最简单方法,它适用于具有简单模态使用的应用程序。我已经看到这种方法在多个地方可靠地工作了多年。本质上,您在路由器中注册了状态更改侦听器,无论何时发生状态更改,您都必须确保关闭所有打开的模式,无论这些模式是什么。再说一次,这看起来似乎很苛刻,但是在某些应用程序中,它就像一个咒语,总比没有好。
一个简单的示例,使用 UI路由器的 @code
服务和 Angular UI Bootstrap的 $transition
,它可以很简单:
$uibModalStack
当然,如果需要,您只能对符合特定条件的转换执行此操作。
来源:https://www.codelord.net/2017/12/11/reliably-managing-modals-in-angularjs/