Як запобігти закриттю angular-ui modal?


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 - як запобігти взаємодії користувача


22

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

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

У мене вгорі праворуч є кнопка закриття, яка викликає дію "скасувати". Натискання на тлі (якщо ввімкнено) викликає дію скасування. Ви можете використовувати це, щоб використовувати різні повідомлення для різних близьких подій.


Як це відповідає на моє запитання?
Рахул Прасад

За допомогою цього ви можете перехопити, якщо модалу було наказано закритись, з причини причини інструкції. Виходячи з цього, ви додаєте власну логіку за бажанням або, можливо, пропонуєте користувачеві підтвердження перед тим, як фактично закрити модаль.
Тіаго

Як було сказано в запитанні, скажіть логіку, яка перешкоджатиме закриттю модалів?
Рахул Прасад

Якщо це все, що ви хочете, просто використовуйте event.preventDefault();всередині case "backdrop click"і поверніться, щоб закінчити виконання.
Тіаго,

4
+1. Це насправді набагато кращий спосіб запобігти закриттю модалів без обмеження функцій (фони та тригери клавіатури). Примітка: подія транслюється, тому її слід прослуховувати в області дії uibModalInstance або нижніх областях. Станом на 0,13: a5a82d9
Сергій Попов

13

Це те, що згадується в документації

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

static може спрацювати.


Чи є якийсь варіант, щоб жодне фонове зображення не відображалося, а модальне вікно не закривалося при натисканні за межі модального вікна?

8

Налаштуйте глобально,

декоратор , одна з найкращих особливостей кутового. дає можливість "латати" сторонні модулі.

Скажімо, ви хочете мати таку поведінку у всіх своїх $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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.