Validazione del modulo AngularJS all'invio: $dirty, $valid e $invalid

โšก Riepilogo intelligente

La validazione dei moduli in AngularJS verifica che i dati inseriti in un modulo siano corretti e completi prima che raggiungano il server. Qui vengono illustrati quattro approcci, dagli attributi HTML5 standard alle proprietร  di scope fino ai moduli di validazione automatica.

  • ๐Ÿงฉ Attributi HTML5: L'attributo obbligatorio e i tipi di input email, password e numero offrono controlli nativi del browser senza bisogno di script.
  • ๐Ÿ” Proprietร  statali: AngularJS espone le variabili $dirty, $pristine, $valid e $invalid per ogni controllo denominato all'interno di un modulo denominato.
  • ๐Ÿท๏ธ Requisiti di denominazione: Sia il modulo che ciascun controllo necessitano di un attributo name, poichรฉ lo stato di validazione viene identificato tramite formName.controlName.
  • ๐Ÿšซ Sopprimi i popup nativi: Aggiungere `novalidate` al modulo impedisce al browser di intercettare l'invio, consentendo cosรฌ ad AngularJS di gestirlo.
  • ???? Visualizzazione dei messaggi: Il modulo ngMessages sostituisce le direttive ng-show sovrapposte e mostra un errore alla volta in ordine di prioritร .
  • โš™๏ธ Validazione automatica: Il modulo jcs-autoValidate genera messaggi di errore per ogni controllo senza bisogno di markup personalizzato.
  • ๐Ÿ”˜ Feedback sull'invio: Un pulsante Ladda attiva un indicatore di caricamento durante l'invio del modulo, segnalando all'utente lo stato di avanzamento.

Convalida del modulo in AngularJS

Convalida del modulo In AngularJS, la validazione รจ il processo che verifica la correttezza e la completezza dei dati inseriti in un modulo. Quando un utente invia il modulo, la validazione avviene prima che i dati vengano inviati al server. Il processo di validazione garantisce, per quanto possibile, che i campi di input siano stati compilati correttamente.

Per fare un esempio concreto, immaginiamo un sito che richieda la compilazione di un modulo di registrazione prima di concedere l'accesso completo. La pagina di registrazione conterrebbe campi per nome utente, password, indirizzo email e cosรฌ via.

Ad esempio, l'indirizzo email deve sempre essere nel formato nomeutente@sito.dominioSe qualcuno inserisce solo il nome utente, la convalida dovrebbe fallire. La convalida esegue questi controlli di base prima che i dati vengano inviati al server per l'ulteriore elaborazione.

โš ๏ธ Nota sulla versione: AngularJS (versione 1.x) ha raggiunto la fine del suo ciclo di vita il 31 dicembre 2021 e non riceve ulteriori patch di sicurezza. Le tecniche descritte di seguito rimangono valide per le applicazioni legacy; le versioni moderne di Angular gestiscono lo stesso compito con moduli reattivi o basati su template.

Convalida del modulo utilizzando HTML5

La validazione dei moduli รจ il processo di pre-validazione delle informazioni inserite in un modulo web prima che vengano inviate al server. La validazione lato client รจ preferibile, perchรฉ comporta un sovraccarico molto inferiore rispetto alla ripresentazione del modulo dopo un round trip.

L'esempio seguente mostra un semplice modulo di registrazione in cui l'utente inserisce nome utente, password, indirizzo email ed etร . Il modulo include controlli di validazione che garantiscono l'inserimento corretto delle informazioni.

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Event Registration</title>
    <link rel="stylesheet" href="lib/bootstrap.css">
    <script src="https://code.angularjs.org/1.8.3/angular.min.js"></script>
</head>
<body ng-app="sampleApp">
<h1>Guru99 Global Event</h1>

<form>
    Enter your user name:
    <input type="text" name="name" required><br><br>

    Enter your password:
    <input type="password" name="password"><br><br>

    Enter your email:
    <input type="email" name="email"><br><br>

    Enter your age:
    <input type="number" name="age"><br><br>

    <input type="submit" value="Submit">
</form>
</body>
</html>

โš ๏ธ Sono state apportate correzioni a tutti gli annunci presenti in questa pagina. Gli originali dichiararono chrset="UTF 8", che non รจ nรฉ un attributo valido nรฉ una codifica valida, e ha caricato AngularJS tre volte โ€” angular-route.js in primo luogo, che genera un errore perchรฉ il modulo di percorso si registra rispetto a un framework che non รจ stato caricato, quindi angular.min.js and angular.js, la stessa biblioteca due volte. Hanno anche tirato fuori bootstrap.css attraverso un <script> tag, quindi non รจ mai stato applicato alcuno stile. Ogni elenco ora carica una libreria, versione 1.8.3, e collega correttamente il foglio di stile. Il padding del layout รจ costruito da ripetuto &nbsp; Le entitร  sono state rimosse.

Code Spiegazione

  1. Per il tipo di input di testo, il required L'attributo indica che la casella di testo non puรฒ essere vuota al momento dell'invio del modulo.
  2. Il tipo di input successivo รจ password. Poichรฉ il tipo รจ contrassegnato come password, il testo inserito nel campo viene mascherato.
  3. Poichรฉ il tipo di input รจ specificato come email, il testo nella casella deve corrispondere al modello nome@sito.dominio.
  4. Quando il tipo di input รจ impostato su "numero", i caratteri digitati dalla tastiera non vengono accettati dal campo.

Uscita

Per vedere la convalida in azione, fai clic su Invia senza inserire nulla.

Viene visualizzato un messaggio a comparsa che segnala la necessitร  di compilare il campo, pertanto il controllo contrassegnato come obbligatorio impedisce l'invio del modulo se viene lasciato vuoto.

Inserendo un valore nel campo della password, i caratteri vengono mascherati dal simbolo '*'.

Inserendo un indirizzo email non valido e cliccando su Invia, compare una finestra di dialogo che richiede il simbolo @. Infine, i caratteri digitati nel campo relativo all'etร  non vengono visualizzati, poichรฉ il campo accetta solo numeri.

I popup del browser sono facili e veloci da configurare, ma il loro testo e il loro stile non possono essere modificati. รˆ qui che entrano in gioco le proprietร  di validazione di AngularJS.

Convalida del modulo utilizzando $dirty, $valid, $invalid, $pristine

AngularJS fornisce le proprie proprietร  per la convalida. Le seguenti proprietร  sono esposte su ogni controllo denominato:

  • $ sporco โ€“ L'utente ha interagito con il controllo
  • $valido โ€“ Il contenuto del campo รจ valido
  • $non valido โ€“ Il contenuto del campo non รจ valido
  • $ immacolato โ€“ L'utente non ha ancora interagito con il controllo

Di seguito sono riportati i passaggi per eseguire la validazione in AngularJS.

Passo 1) Usa il novalidate Questa proprietร  viene specificata durante la dichiarazione del modulo. Indica al browser che la validazione verrร  gestita da AngularJS.

Passo 2) Assicurati che al modulo sia stato assegnato un nome, perchรฉ tale nome verrร  utilizzato per raggiungere lo stato di validazione.

Passo 3) Assicurarsi che ogni controllo abbia anche un name attributo, per lo stesso motivo. Un controllo senza nome non viene mai registrato nel modulo.

Passo 4) Usa il ng-mostra Direttiva per verificare le proprietร  $dirty, $invalid e $valid.

L'esempio seguente presenta un singolo campo di testo in cui l'utente inserisce il nome di un argomento. Se il campo viene lasciato vuoto, viene generato un errore di convalida e viene visualizzato il messaggio.

<form ng-app="DemoApp" ng-controller="DemoController"
      name="myForm" novalidate>
    <p>Topic Name:<br>
        <input type="text" name="user" ng-model="user" required>

        <span style="color:red"
              ng-show="myForm.user.$dirty && myForm.user.$invalid">
            <span ng-show="myForm.user.$error.required">Username is required</span>
        </span>
    </p>
    <p>
        <input type="submit" ng-disabled="myForm.$invalid">
    </p>
</form>

<script>
    var app = angular.module("DemoApp", []);

    app.controller("DemoController", function($scope) {
        // Seed the textbox so the form starts in a valid state
        $scope.user = "AngularJS";
    });
</script>

โš ๏ธ Due errori logici corretti. L'originale ha disabilitato il pulsante con ng-disabled="myForm.user.$dirty && myForm.user.$invalid". Perchรฉ $dirty รจ falso finchรฉ l'utente non tocca il campo, il pulsante rimane abilitato su un modulo vuoto non modificato, esattamente il caso che doveva bloccare; myForm.$invalid copre entrambi. L'originale racchiudeva anche il valore predefinito in $scope.Display = function () { $scope.user = 'Angular'; }, una funzione che non รจ mai stata chiamata, quindi la casella di testo si รจ aperta vuota nonostante il testo affermasse di mostrare "AngularJS". L'assegnazione ora viene effettuata direttamente, con il valore racchiuso tra virgolette.

Code Spiegazione

  1. Al modulo viene assegnato il nome "myForm". Questo รจ necessario per poter accedere ai relativi controlli di validazione.
  2. Migliori novalidate Questa proprietร  impedisce al browser di eseguire la convalida, consentendo ad AngularJS di farlo al suo posto.
  3. La direttiva ng-show controlla le proprietร  "$dirty" e "$invalid". Se la casella di testo รจ stata modificata, $dirty รจ true; se il suo valore รจ vuoto, $invalid รจ true. Quando entrambe sono vere, viene visualizzato lo span con il testo rosso.
  4. Il controllo annidato legge la proprietร  "$error.required", che รจ vera ogni volta che un controllo obbligatorio non ha un valore, e visualizza "Il nome utente รจ obbligatorio".
  5. Il pulsante di invio รจ disabilitato tramite ng-disabled ogniqualvolta il modulo nel suo complesso non รจ valido.
  6. Il controller imposta il valore iniziale della casella di testo su "AngularJS", in modo che il modulo si apra in uno stato valido e la validazione sia piรน facile da osservare man mano che il testo viene eliminato.

Uscita

Quando il modulo viene visualizzato per la prima volta, la casella di testo mostra "AngularJS" e il pulsante di invio รจ abilitato. Non appena il testo viene rimosso, compare il messaggio di errore e il pulsante viene disabilitato.

La schermata qui sopra mostra due cose:

  • Il pulsante di invio รจ disabilitato
  • Nella casella di testo "Argomento" non รจ presente alcun nome per l'argomento, pertanto viene visualizzato il messaggio di errore "Il nome utente รจ obbligatorio".

Come visualizzare gli errori di validazione con ngMessages

Lo schema sopra funziona, ma non รจ scalabile. Un campo con quattro vincoli necessita di quattro vincoli annidati ng-show intervalli, e quando diversi di essi falliscono contemporaneamente, ogni messaggio appare insieme. ngMessages Il modulo, distribuito separatamente dal team di AngularJS, risolve entrambi i problemi: mostra un messaggio alla volta, nell'ordine in cui i messaggi sono stati scritti.

Carica il modulo e aggiungilo come dipendenza.

<script src="https://code.angularjs.org/1.8.3/angular-messages.js"></script>
<script>
    angular.module("DemoApp", ["ngMessages"]);
</script>

Il markup viene quindi letto come un elenco di regole anzichรฉ come una serie di condizioni.

<input type="text" name="user" ng-model="user"
       required ng-minlength="4" ng-maxlength="20">

<div style="color:red" ng-messages="myForm.user.$error"
     ng-if="myForm.user.$dirty">
    <div ng-message="required">A topic name is required</div>
    <div ng-message="minlength">Use at least 4 characters</div>
    <div ng-message="maxlength">Use no more than 20 characters</div>
</div>

Tre dettagli fanno sรฌ che questo si comporti bene nella pratica. ng-messages punti attributo al controllo $error oggetto piuttosto che un valore booleano, quindi nessuna condizione deve essere ripetuta. Solo la prima corrispondenza ng-message renderizza, il che significa che un campo vuoto segnala che รจ obbligatorio invece di lamentarsi anche della sua lunghezza. Aggiungendo ng-messages-multiple inverte tale comportamento quando ogni errore deve essere effettivamente elencato.

Avvolgereping il blocco in ng-if="myForm.user.$dirty" mantiene il modulo silenzioso finchรฉ l'utente non ha effettivamente digitato qualcosa. Sostituzione $touched per $dirty ritarda ulteriormente il messaggio, fino a quando il focus non si sposta dal campo, che di solito รจ l'opzione piรน amichevole in un modulo di registrazione lungo.

Un avvertimento: ngMessages Il codice viene inviato come file separato, quindi dimenticare il tag script o la dipendenza dal modulo fa sรฌ che il blocco non visualizzi nulla, senza alcun errore nella console che lo spieghi.

Scrivere messaggi a mano รจ preciso ma ripetitivo. La sezione successiva descrive un modulo che li genera automaticamente.

Convalida del modulo utilizzando AngularJS Auto Validate

AngularJS รจ in grado di validare automaticamente tutti i controlli di un modulo, senza bisogno di codice personalizzato per la validazione o i messaggi di errore. Ciรฒ รจ possibile grazie all'inclusione di un modulo della community chiamato "jcs-autoValidate".

Grazie a questo modulo, non รจ necessario alcun codice speciale per eseguire la validazione o visualizzare i messaggi; tutto viene gestito all'interno di jcs-autoValidate.

L'esempio seguente presenta un semplice modulo con un'unica casella di testo obbligatoria. Viene visualizzato un messaggio di errore se il campo non viene compilato.

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Event Registration</title>
    <link rel="stylesheet" href="lib/bootstrap.css">
    <script src="https://code.angularjs.org/1.8.3/angular.min.js"></script>
    <script src="lib/jcs-auto-validate.min.js"></script>
</head>
<body>
<h1>Guru99 Event</h1>

<div ng-app="DemoApp">
    <form name="myForm" novalidate>
        <div class="form-group">
            <label for="user">Topic Name:</label>
            <input class="form-control" type="text"
                   id="user" name="user" ng-model="user" required>
        </div>
        <div class="form-group">
            <input type="submit">
        </div>
    </form>
</div>

<script>
    var app = angular.module('DemoApp', ['jcs-autoValidate']);
</script>
</body>
</html>

โš ๏ธ Correzione: l'originale ha identificato il controllo con id="user" solo. jcs-autoValidate raggiunge il controllo attraverso il modulo, quindi un name L'attributo รจ obbligatorio e il messaggio non รจ mai apparso senza di esso. L'originale ha anche caricato due diverse versioni di AngularJS, 1.6.4 da Google CDN insieme alla versione 1.6.9, e mai collegato Bootstrap anche se l'esempio dipende da esso form-group and form-control classi per posizionare il testo di errore.

Nota: jcs-autoValidate รจ un progetto della community e non รจ piรน attivamente mantenuto. Rimane utilizzabile nelle applicazioni AngularJS esistenti, ma il componente integrato ngMessages L'approccio illustrato in precedenza รจ la scelta piรน sicura per qualsiasi novitร .

Code Spiegazione

  1. Lo script "jcs-auto-validate.js", che contiene tutte le funzionalitร  di autovalidazione, รจ incluso.
  2. Ogni controllo e il relativo div circostante sono posizionati all'interno di una classe "form-group", dove il modulo inserisce il suo messaggio.
  3. Il controllo porta sia un ID che un namee Bootstrap fornisce il form-control messa in piega.
  4. Il modulo โ€œjcs-autoValidateโ€ รจ elencato come dipendenza del modulo AngularJS.

Uscita

Per impostazione predefinita, il modulo viene visualizzato esattamente come รจ stato scritto.

L'invio del modulo vuoto visualizza il messaggio "Questo campo รจ obbligatorio", generato interamente da jcs-autoValidate. Una volta convalidato il modulo, la domanda che rimane รจ cosa vede l'utente durante l'invio.

Feedback degli utenti con i pulsanti Ladda

I pulsanti โ€œLaddaโ€ sono una struttura costruita sopra JavaCopione che conferisce ai pulsanti un effetto visivo quando vengono premuti.

Se a un pulsante viene assegnato l'attributo "ladda" e viene premuto, viene visualizzato un effetto di rotazione. Sono disponibili diversi stili di dati per ulteriori effetti visivi.

L'esempio seguente mostra un semplice modulo con un pulsante di invio. Quando si preme il pulsante, su di esso appare un effetto di rotazione.

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Event Registration</title>
    <link rel="stylesheet" href="lib/bootstrap.css">
    <script src="https://code.angularjs.org/1.8.3/angular.min.js"></script>
    <script src="lib/angular-ladda.min.js"></script>
</head>
<body>
<h1>Guru99 Event</h1>

<div ng-app="DemoApp" ng-controller="DemoController">
    <form name="myForm" novalidate ng-submit="submit()">
        <button class="btn btn-primary" type="submit"
                ladda="submitting" name="sbutton"
                data-style="expand-right">Submit</button>
    </form>
</div>

<script>
    var app = angular.module('DemoApp', ['angular-ladda']);

    app.controller('DemoController', function($scope) {
        $scope.submitting = false;

        $scope.submit = function() {
            $scope.submitting = true;
        };
    });
</script>
</body>
</html>

โš ๏ธ Correzione: l'originale caricato angular-ladda.js and angular-ladda.min.js insieme, che registra lo stesso modulo due volte, e ha nuovamente incluso due versioni di AngularJS. Ha anche elencato jcs-autoValidate come dipendenza che questo esempio non utilizza mai. Qui viene caricata una copia di ciascuna libreria.

Code Spiegazione

  1. Il "ng-inviaLa direttiva " richiama una funzione denominata "submit", che modifica l'attributo ladda del pulsante.
  2. L'attributo ladda appartiene al framework Ladda ed รจ ciรฒ che aggiunge l'effetto spin. Il suo valore รจ legato a submitting variabile.
  3. La proprietร  data-style รจ un altro attributo di Ladda che seleziona un effetto visivo differente.
  4. Perchรฉ il framework funzioni, รจ necessario aggiungere il modulo 'angular-ladda' all'applicazione AngularJS.
  5. Migliori submitting La variabile viene inizializzata a false, quindi il pulsante si avvia senza l'effetto di rotazione.
  6. La funzione di invio imposta submitting impostandolo su true, il che applica l'effetto. In un'applicazione reale verrebbe reimpostato su false una volta che il server risponde, altrimenti il โ€‹โ€‹pulsante continua a girare all'infinito.

Uscita

Quando il modulo viene visualizzato per la prima volta, il pulsante di invio viene mostrato nella sua forma semplice.

Quando il pulsante viene premuto, il submitting La variabile รจ impostata su true. Tale valore raggiunge l'attributo "ladda" del pulsante, producendo l'effetto di rotazione.

DOMANDE FREQUENTI

$dirty diventa vero quando il valore cambia. $touched diventa vero quando il campo perde il focus. Usa $touched per ritardare un errore finchรฉ l'utente non si รจ spostato, il che sembra meno aggressivo mentre typing.

Aggiungi la direttiva ng-pattern con un'espressione regolare, ad esempio ng-pattern=โ€/^[0-9]{6}$/โ€. L'errore verrร  quindi visualizzato come $error.pattern, che ngMessages puรฒ segnalare come qualsiasi vincolo integrato.

Sรฌ. Gli strumenti di intelligenza artificiale leggono il markup e generano blocchi ng-pattern e ngMessages corrispondenti. รˆ sempre consigliabile rivedere le espressioni regolari, poichรฉ i modelli di email e numeri di telefono generati spesso rifiutano input validi.

Gli assistenti basati sull'IA verificano rapidamente le tre cause piรน comuni: un attributo name mancante nel modulo o nel controllo, un ng-model mancante e l'opzione novalidate disabilitata, in modo che il browser intercetti prima l'invio del modulo.

No. Migliora l'esperienza e riduce i viaggi di andata e ritorno, ma chiunque puรฒ aggirarlo con gli strumenti per sviluppatori. Ogni regola applicata nel browser deve essere applicata anche sul server.

Riassumi questo post con: