Ricerca…


Convalida del modulo di base

Uno dei punti di forza di Angular è la convalida della forma lato client.

Affrontare gli input di form tradizionali e dover usare l'elaborazione interrogativa in stile jQuery può essere dispendioso in termini di tempo e pignolo. Angular consente di produrre facilmente forme interattive professionali.

La direttiva ng-model fornisce l'associazione bidirezionale con i campi di input e solitamente l'attributo novalidate viene anche inserito sull'elemento form per impedire al browser di eseguire la convalida nativa.

Quindi, una forma semplice sarebbe simile a:

<form name="form" novalidate>
  <label name="email"> Your email </label>
  <input type="email" name="email" ng-model="email" />
</form>

Affinché Angular convalidi gli input, utilizzare esattamente la stessa sintassi di un normale elemento di input , fatta eccezione per l'aggiunta dell'attributo ng-model per specificare la variabile da associare all'ambito. L'email è mostrata nell'esempio precedente. Per convalidare un numero, la sintassi sarebbe:

<input type="number" name="postalcode" ng-model="zipcode" />

I passaggi finali per la convalida del modulo di base sono la connessione a una funzione di invio del modulo sul controller utilizzando ng-submit , anziché consentire l'invio del modulo predefinito. Questo non è obbligatorio, ma viene solitamente utilizzato, poiché le variabili di input sono già disponibili nell'ambito e quindi disponibili per la funzione di invio. Di solito è anche una buona pratica dare un nome al modulo. Queste modifiche comporterebbero la seguente sintassi:

<form name="signup_form" ng-submit="submitFunc()" novalidate>
  <label name="email"> Your email </label>
  <input type="email" name="email" ng-model="email" />
  <button type="submit">Signup</button>
</form>

Questo codice sopra è funzionale, ma esistono altre funzionalità fornite da Angular.

Il passo successivo è capire che Angular allega gli attributi di classe usando ng-pristine , ng-dirty , ng-valid e ng-invalid per l'elaborazione dei moduli. L'utilizzo di queste classi nel tuo css ti consentirà di definire i campi di input validi / non validi, pristine / dirty e quindi di alterare la presentazione mentre l'utente sta inserendo i dati nel modulo.

Forma e Stati di input

Forme e input angolari hanno vari stati che sono utili quando si convalida il contenuto

Stati di input

Stato Descrizione
$touched Field è stato toccato
$untouched Il campo non è stato toccato
$pristine Il campo non è stato modificato
$dirty Il campo è stato modificato
$valid Il contenuto del campo è valido
$invalid Il contenuto del campo non è valido

Tutti gli stati sopra riportati sono proprietà booleane e possono essere sia vere che false.

Con questi, è molto facile visualizzare messaggi a un utente.

<form name="myForm" novalidate>
    <input name="myName" ng-model="myName" required>
    <span ng-show="myForm.myName.$touched && myForm.myName.$invalid">This name is invalid</span>
</form>

Qui, stiamo usando la direttiva ng-show per mostrare un messaggio ad un utente se hanno modificato un modulo ma non è valido.

Classi CSS

Angular fornisce anche alcune classi CSS per moduli e input a seconda del loro stato

Classe Descrizione
ng-touched Field è stato toccato
ng-untouched Il campo non è stato toccato
ng-pristine Il campo non è stato modificato
ng-dirty Il campo è stato modificato
ng-valid Il campo è valido
ng-invalid Il campo non è valido

Puoi usare queste classi per aggiungere stili ai tuoi moduli

input.ng-invalid {
  background-color: crimson;
}
input.ng-valid {
  background-color: green;
}

ngMessages

ngMessages viene utilizzato per migliorare lo stile per la visualizzazione dei messaggi di convalida nella vista.

Approccio tradizionale

Prima di ngMessages , normalmente visualizziamo i messaggi di convalida usando le direttive predefinite angolari ng-class . Questo approccio consisteva in rifiuti e un'attività repetitive .

Ora, usando ngMessages , possiamo creare i nostri messaggi personalizzati.

Esempio

Html:

<form name="ngMessagesDemo">
  <input name="firstname" type="text" ng-model="firstname" required>
  <div ng-messages="ngMessagesDemo.firstname.$error">
    <div ng-message="required">Firstname is required.</div>
  </div>
</form>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.16/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.16/angular-messages.min.js"></script>

JS:

var app = angular.module('app', ['ngMessages']);

app.controller('mainCtrl', function ($scope) { 
    $scope.firstname = "Rohit";
});

Convalida del modulo personalizzato

In alcuni casi la convalida di base non è sufficiente. Convalida personalizzata del supporto angolare che aggiunge funzioni di $validators all'oggetto $validators su ngModelController :

angular.module('app', [])
  .directive('myValidator', function() {
    return {
      // element must have ng-model attribute
      // or $validators does not work
      require: 'ngModel',
      link: function(scope, elm, attrs, ctrl) {
        ctrl.$validators.myValidator = function(modelValue, viewValue) {
            // validate viewValue with your custom logic
            var valid = (viewValue && viewValue.length > 0) || false;
            return valid; 
        };
      } 
    };

Il validatore è definito come una direttiva che richiede ngModel , quindi per applicare il validatore basta aggiungere la direttiva personalizzata al controllo del modulo di input.

<form name="form">
  <input type="text" 
         ng-model="model" 
         name="model" 
         my-validator>
  <pre ng-bind="'my-validator returned: ' + form.model.$valid"></pre>
</form> 

E il my-validator non deve essere applicato al controllo dei moduli nativi. Può essere qualsiasi elemento, purché come ng-model nei suoi attributi. Ciò è utile quando hai un componente ui di build personalizzato.

esempio

Moduli nidificati

A volte è preferibile annidare le forme allo scopo di raggruppare i controlli e gli ingressi logicamente sulla pagina. Tuttavia, i moduli HTML5 non devono essere nidificati. Forniture angolari invece di ng-form .

<form name="myForm" noValidate>
  <!-- nested form can be referenced via 'myForm.myNestedForm' -->
  <ng-form name="myNestedForm" noValidate>
    <input name="myInput1" ng-minlength="1" ng-model="input1" required />
    <input name="myInput2" ng-minlength="1" ng-model="input2" required />
  </ng-form>

  <!-- show errors for the nested subform here -->
  <div ng-messages="myForm.myNestedForm.$error">
    <!-- note that this will show if either input does not meet the minimum -->
    <div ng-message="minlength">Length is not at least 1</div>
  </div>
</form>

<!-- status of the form -->
<p>Has any field on my form been edited? {{myForm.$dirty}}</p>
<p>Is my nested form valid? {{myForm.myNestedForm.$valid}}</p>
<p>Is myInput1 valid? {{myForm.myNestedForm.myInput1.$valid}}</p>

Ogni parte del modulo contribuisce allo stato generale del modulo. Pertanto, se uno degli input myInput1 è stato modificato ed è $dirty , il suo modulo contenente sarà anche $dirty . Questa cascata a ogni modulo che contiene, in modo che entrambi myNestedForm e myForm sarà $dirty .

Validatori asincroni

I validatori asincroni consentono di convalidare le informazioni del modulo sul back-end (utilizzando $ http).

Questi tipi di validatori sono necessari quando è necessario accedere alle informazioni memorizzate sul server che non si possono avere sul client per vari motivi, come la tabella degli utenti e altre informazioni sul database.

Per utilizzare i validatori asincroni, si accede al ng-model del proprio input e si definiscono le funzioni di callback per la proprietà $asyncValidators .

Esempio:

L'esempio seguente controlla se esiste già un nome fornito, il backend restituirà uno stato che rifiuterà la promessa se il nome esiste già o se non è stato fornito. Se il nome non esiste, restituirà una promessa risolta.

ngModel.$asyncValidators.usernameValidate = function (name) {               
     if (name) {
          return AuthenticationService.checkIfNameExists(name); // returns a promise
     } else {
          return $q.reject("This username is already taken!"); // rejected promise
     }
};

Ora ogni volta che viene modificato il ng-model dell'ingresso, questa funzione verrà eseguita e restituirà una promessa con il risultato.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow