How do I prevent angular-ui modal from closing?
Asked Answered
F

6

91

I am using Angular UI $modal in my project http://angular-ui.github.io/bootstrap/#/modal

I don't want user to close the modal by pressing on backdrop. I want a modal can only be closed by pressing close button which I have created.

How do I prevent modal from closing ?

Frederickfredericka answered 29/11, 2013 at 12:59 Comment(0)
L
200

While you creating your modal you can specify its behavior:

$modal.open({
   // ... other options
   backdrop  : 'static',
   keyboard  : false
});
Loquat answered 29/11, 2013 at 13:29 Comment(1)
Is there any way to set these dynamically -- say if the popup is in the middle of an operation that shouldn't be interrupted?Fayth
F
37
backdrop : 'static'

Will work for 'click' events but still you can use "Esc" key to close the popup.

keyboard :false

to prevent popup close by "Esc" key.

Thanks to pkozlowski.opensource for answer.

I think question is duplicate of Angular UI Bootstrap Modal - how to prevent user interaction

Feminine answered 26/5, 2015 at 10:20 Comment(0)
D
23

Old question, but if you want to add confirmation dialogs on various close actions, add this to your modal instance controller:

$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();
    }
});

I have a close button on the top right of mine, which triggers the "cancel" action. Clicking on the backdrop (if enabled), triggers the cancel action. You can use that to use different messages for various close events.

Dystrophy answered 16/3, 2016 at 11:45 Comment(5)
How does it answer my question ?Frederickfredericka
With this you can intercept if a modal has been instructed to close, by the reason for the instruction. Based on that you add custom logic if desired, or perhaps prompt the user for confirmation before actually closing the modal.Dystrophy
As question stated, Tell me a logic, which will prevent modal from closing ?Frederickfredericka
If that's all you want, then just use event.preventDefault(); inside case "backdrop click" and return to end the execution.Dystrophy
+1. This is actually a much better way to prevent modal from closing without limiting features (backdrop & keyboard triggers). Note: event is broadcasted so must be listened on uibModalInstance scope or downstream scopes. As of 0.13: a5a82d9Standridge
R
13

This is what is mentioned in documentation

backdrop - controls presence of a backdrop. Allowed values: true (default), false (no backdrop), 'static' - backdrop is present but modal window is not closed when clicking outside of the modal window.

static may work.

Repetend answered 29/11, 2013 at 13:11 Comment(1)
Is there any option so that no backdrop should display and modal window should get closed when clicking outside of the modal window?Murielmurielle
U
8

Configure globally,

decorator, one of the best features in angular. gives the ability to "patch" 3rd party modules.

Let's say you want this behavior in all of your $modal references and you don't want to change your calls,

You can write a decorator. that simply adds to options - {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;
    })
});
  • Note: in the latest versions, the $modal renamed to $uibModal

Online demo - http://plnkr.co/edit/2MWIpOs3uAG5EFQy6Ndn?p=preview

Uphroe answered 15/8, 2016 at 14:46 Comment(0)
L
5

for the new version of ngDialog (0.5.6), use:

closeByEscape : false
closeByDocument : false
Layout answered 1/2, 2016 at 9:7 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.