Как предотвратить закрытие модального окна angular-ui?

86

Я использую Angular UI $ modal в своем проекте http://angular-ui.github.io/bootstrap/#/modal

Я не хочу, чтобы пользователь закрыл модальное окно, нажав на фон. Я хочу, чтобы модальное окно можно было закрыть, только нажав созданную мной кнопку закрытия.

Как предотвратить закрытие модального окна?

Рахул Прасад
источник

Ответы:

193

При создании модального окна вы можете указать его поведение:

$modal.open({
   // ... other options
   backdrop  : 'static',
   keyboard  : false
});
Артур Гжесяк
источник
2
Да, это правильный ответ :) Спасибо, что поделились!
Skywalker
Круто! Спасибо, что поделился. +1
Хан Тран
10
Есть ли способ установить их динамически - скажем, если всплывающее окно находится в середине операции, которую нельзя прерывать?
RonLugge
35
backdrop : 'static'

Будет работать для событий «щелчок», но вы все равно можете использовать клавишу «Esc», чтобы закрыть всплывающее окно.

keyboard :false

чтобы предотвратить всплывающее окно, закройте клавишей «Esc».

Спасибо pkozlowski.opensource для ответа.

Я думаю, что вопрос дублирует Angular UI Bootstrap Modal - как предотвратить взаимодействие с пользователем

Сачин Г.
источник
23

Старый вопрос, но если вы хотите добавить диалоговые окна подтверждения для различных действий закрытия, добавьте это в свой модальный контроллер экземпляра:

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

У меня есть кнопка закрытия в правом верхнем углу, которая запускает действие «отменить». При нажатии на фон (если он включен) запускается действие отмены. Вы можете использовать это, чтобы использовать разные сообщения для различных событий закрытия.

Тьяго
источник
Как он отвечает на мой вопрос?
Рахул Прасад
С его помощью вы можете перехватить, если модальное окно было приказано закрыть, по причине инструкции. Исходя из этого, вы при желании добавляете настраиваемую логику или, возможно, запрашиваете у пользователя подтверждение перед фактическим закрытием модального окна.
Tiago
Как сформулирован вопрос, скажите мне логику, которая предотвратит закрытие модального окна?
Рахул Прасад
Если это все, что вам нужно, просто используйте event.preventDefault();inside case "backdrop click"и вернитесь, чтобы завершить выполнение.
Tiago
5
+1. На самом деле это гораздо лучший способ предотвратить закрытие модального окна без ограничения функций (фон и триггеры клавиатуры). Примечание: событие транслируется, поэтому его необходимо прослушивать в области uibModalInstance или в областях нижестоящего уровня. По состоянию на 0,13: a5a82d9
Сергей Попов
13

Это то, что упоминается в документации

backdrop - контролирует наличие фона. Допустимые значения: true (по умолчанию), false (без фона), «static» - фон присутствует, но модальное окно не закрывается при щелчке за пределами модального окна.

static может работать.

Чандермани
источник
Есть ли вариант, при котором фон не должен отображаться, а модальное окно должно закрываться при щелчке за пределами модального окна?
8

Настроить глобально,

Decorator , одна из лучших функций angular. дает возможность «патчить» сторонние модули.

Допустим, вы хотите, чтобы такое поведение было во всех ваших $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

Йосеф Харуш
источник
5

для новой версии ngDialog (0.5.6) используйте:

closeByEscape : false
closeByDocument : false
Бен Коэн
источник