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

Posted

技术标签:

【中文标题】如何防止 angular-ui 模态关闭?【英文标题】:How do I prevent angular-ui modal from closing? 【发布时间】:2013-12-15 16:34:37 【问题描述】:

我在我的项目中使用 Angular UI $modal http://angular-ui.github.io/bootstrap/#/modal

我不希望用户通过按下背景来关闭模式。我想要一个模式只能通过按下我创建的关闭按钮来关闭。

如何防止模态关闭?

【问题讨论】:

【参考方案1】:

在创建模态框时,您可以指定其行为:

$modal.open(
   // ... other options
   backdrop  : 'static',
   keyboard  : false
);

【讨论】:

是的,这是正确答案 :) 谢谢分享! 酷!感谢分享。 +1 有没有办法动态设置这些——比如弹出窗口是否在一个不应该被中断的操作中间?【参考方案2】:
backdrop : 'static'

适用于“点击”事件,但您仍然可以使用“Esc”键关闭弹出窗口。

keyboard :false

防止弹出窗口按“Esc”键关闭。

感谢 pkozlowski.opensource 的回答。

我认为问题是重复的 Angular UI Bootstrap Modal - how to prevent user interaction

【讨论】:

【参考方案3】:

老问题,但如果您想在各种关闭操作上添加确认对话框,请将其添加到您的模态实例控制器中:

$scope.$on('modal.closing', function(event, reason, closed) 
    console.log('modal.closing: ' + (closed ? 'close' : 'dismiss') + '(' + reason + ')');
    var message = "You are about to leave the edit view. Uncaught reason. Are you sure?";
    switch (reason)
        // clicked outside
        case "backdrop click":
            message = "Any changes will be lost, are you sure?";
            break;

        // cancel button
        case "cancel":
            message = "Any changes will be lost, are you sure?";
            break;

        // escape key
        case "escape key press":
            message = "Any changes will be lost, are you sure?";
            break;
    
    if (!confirm(message)) 
        event.preventDefault();
    
);

我的右上角有一个关闭按钮,它触发“取消”操作。单击背景(如果启用)会触发取消操作。您可以使用它为各种关闭事件使用不同的消息。

【讨论】:

它如何回答我的问题? 有了这个,如果一个模态被指示关闭,你可以通过指令的原因来拦截。基于此,您可以根据需要添加自定义逻辑,或者在实际关闭模式之前提示用户确认。 如问题所述,告诉我一个逻辑,它会阻止模态关闭? 如果这就是你想要的,那么只需在case "backdrop click" 中使用event.preventDefault(); 并返回以结束执行。 +1。这实际上是在不限制功能(背景和键盘触发器)的情况下防止模式关闭的更好方法。注意:事件是广播,所以必须在 uibModalInstance 范围或下游范围内监听。从 0.13 开始:a5a82d9【参考方案4】:

这是文档中提到的内容

backdrop - 控制背景的存在。允许值:真 (默认), false (无背景), 'static' - 背景存在但 在模态窗口外单击时,模态窗口不会关闭。

static 可能有效。

【讨论】:

在模态窗口外单击时,是否有任何选项可以不显示背景并且关闭模态窗口?【参考方案5】:

全局配置,

decorator, Angular 中最好的功能之一。能够“修补” 3rd 方模块。

假设您希望这种行为在所有$modal 引用中,并且您不想更改呼叫,

你可以写一个装饰器。这只是增加了选项 - backdrop:'static', keyboard:false

angular.module('ui.bootstrap').config(function ($provide) 
    $provide.decorator('$modal', function ($delegate) 
        var open = $delegate.open;

        $delegate.open = function (options) 
            options = angular.extend(options || , 
                backdrop: 'static',
                keyboard: false
            );

            return open(options);
        ;
        return $delegate;
    )
);
注意:在最新版本中,$modal 重命名为$uibModal

在线演示 - http://plnkr.co/edit/2MWIpOs3uAG5EFQy6Ndn?p=preview

【讨论】:

【参考方案6】:

对于新版本的ngDialog(0.5.6),使用:

closeByEscape : false
closeByDocument : false

【讨论】:

以上是关于如何防止 angular-ui 模态关闭?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止模态盒关闭?

AngularJS。调用 angular-ui 模态时清除 $timeout

在 Ionic 的模态之外单击时如何防止模态消失?

Twitter Bootstrap / jQuery - 如何暂时防止模式被关闭?

使用 jquery 防止 yii 模态弹出窗口关闭

提交表单后如何防止模式关闭