Come posso impedire la chiusura modale angolare-ui?


Risposte:


193

Mentre crei il tuo modale puoi specificarne il comportamento:

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

2
Sì, questa è la risposta corretta :) Grazie per averla condivisa!
Skywalker

Freddo! Grazie per la condivisione. +1
Khanh Tran

10
Esiste un modo per impostarli dinamicamente, ad esempio se il popup è nel mezzo di un'operazione che non dovrebbe essere interrotta?
RonLugge


23

Vecchia domanda, ma se desideri aggiungere finestre di dialogo di conferma su varie azioni di chiusura, aggiungilo al controller dell'istanza modale:

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

Ho un pulsante di chiusura in alto a destra, che attiva l'azione "Annulla". Facendo clic sullo sfondo (se abilitato), attiva l'azione di annullamento. Puoi usarlo per usare messaggi diversi per vari eventi di chiusura.


Come risponde alla mia domanda?
Rahul Prasad

Con questo puoi intercettare se un modale è stato istruito a chiudere, dal motivo dell'istruzione. In base a ciò, aggiungi la logica personalizzata se lo desideri, o forse chiedi conferma all'utente prima di chiudere effettivamente il modale.
Tiago

Come affermato dalla domanda, Dimmi una logica, che impedirà la chiusura modale?
Rahul Prasad

Se è tutto ciò che vuoi, usa solo event.preventDefault();dentro case "backdrop click"e torna per terminare l'esecuzione.
Tiago

5
+1. Questo è in realtà un modo molto migliore per impedire la chiusura modale senza limitare le funzionalità (sfondo e trigger della tastiera). Nota: l'evento viene trasmesso, quindi deve essere ascoltato sull'ambito uibModalInstance o sugli ambiti downstream. A partire da 0.13: a5a82d9
Sergej Popov

13

Questo è ciò che è menzionato nella documentazione

sfondo: controlla la presenza di uno sfondo. Valori consentiti: true (predefinito), false (senza sfondo), 'statico' - lo sfondo è presente ma la finestra modale non viene chiusa quando si fa clic al di fuori della finestra modale.

static può funzionare.


C'è qualche opzione in modo che nessuno sfondo debba essere visualizzato e la finestra modale debba essere chiusa quando si fa clic al di fuori della finestra modale?

8

Configura a livello globale,

decoratore , una delle migliori caratteristiche in angolare. dà la possibilità di "patchare" moduli di terze parti.

Diciamo che vuoi questo comportamento in tutti i tuoi $modalriferimenti e non vuoi cambiare le tue chiamate,

Puoi scrivere un decoratore . che si aggiunge semplicemente alle opzioni -{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;
    })
});
  • Nota: nelle ultime versioni, il file $modalrinominato in$uibModal

Demo online - http://plnkr.co/edit/2MWIpOs3uAG5EFQy6Ndn?p=preview


5

per la nuova versione di ngDialog (0.5.6), usa:

closeByEscape : false
closeByDocument : false
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.