Suche…


Grundlegende Formularvalidierung

Eine der Stärken von Angular ist die clientseitige Formularvalidierung.

Der Umgang mit herkömmlichen Formulareingaben und die Verwendung von abfragender jQuery-Verarbeitung ist zeitaufwändig und umständlich. Mit Angular können Sie relativ einfach professionelle interaktive Formulare erstellen.

Die ng-model- Direktive bietet eine bidirektionale Bindung mit Eingabefeldern. Normalerweise wird das Attribut novalidate auch im Formularelement platziert, um zu verhindern, dass der Browser die native Überprüfung durchführt.

Ein einfaches Formular würde also so aussehen:

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

Verwenden Sie für die Überprüfung der Eingaben von Angular genau die gleiche Syntax wie ein reguläres Eingabeelement , mit Ausnahme des Zusatzes ng-model , um anzugeben, an welche Variable im Bereich gebunden werden soll. E-Mail wird im vorherigen Beispiel gezeigt. Um eine Zahl zu bestätigen, würde die Syntax lauten:

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

Die letzten Schritte zur grundlegenden Formularüberprüfung bestehen darin, eine Verbindung zu einer Formularübergabefunktion auf dem Controller mithilfe von ng-submit herzustellen, anstatt das Standardformular absenden zuzulassen. Dies ist nicht obligatorisch, wird jedoch in der Regel verwendet, da die Eingabevariablen bereits im Gültigkeitsbereich vorhanden sind und somit Ihrer Übermittlungsfunktion zur Verfügung stehen. In der Regel empfiehlt es sich, der Form einen Namen zu geben. Diese Änderungen würden zu folgender Syntax führen:

<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>

Der obige Code ist funktionsfähig, aber es gibt andere Funktionen, die Angular bietet.

Der nächste Schritt besteht darin, zu verstehen, dass Angular Klassenattribute mit ng-pristine , ng-dirty , ng-valid und ng-invalid für die Formularverarbeitung anfügt. Wenn Sie diese Klassen in Ihrer CSS-Datei verwenden, können Sie gültige / ungültige und unverfälschte / fehlerhafte Eingabefelder formatieren und so die Präsentation ändern, wenn der Benutzer Daten in das Formular eingibt.

Form- und Eingabezustände

Winkelformen und Eingaben weisen verschiedene Status auf, die bei der Überprüfung von Inhalten hilfreich sind

Eingabezustände

Zustand Beschreibung
$touched Feld wurde berührt
$untouched Feld wurde nicht berührt
$pristine Feld wurde nicht geändert
$dirty Feld wurde geändert
$valid Feldinhalt ist gültig
$invalid Feldinhalt ist ungültig

Alle oben genannten Zustände sind boolesche Eigenschaften und können entweder wahr oder falsch sein.

Mit diesen ist es sehr einfach, einem Benutzer Nachrichten anzuzeigen.

<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>

Hier verwenden wir die Anweisung ng-show , um einem Benutzer eine Nachricht anzuzeigen, wenn er ein Formular geändert hat, das aber ungültig ist.

CSS-Klassen

Angular stellt abhängig vom Status auch einige CSS-Klassen für Formulare und Eingaben bereit

Klasse Beschreibung
ng-touched Feld wurde berührt
ng-untouched Feld wurde nicht berührt
ng-pristine Feld wurde nicht geändert
ng-dirty Feld wurde geändert
ng-valid Feld ist gültig
ng-invalid Feld ist ungültig

Sie können diese Klassen verwenden, um Ihren Formularen Formatvorlagen hinzuzufügen

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

ngNachrichten

ngMessages wird verwendet, um den Stil für die Anzeige von Überprüfungsmeldungen in der Ansicht zu verbessern.

Traditioneller Ansatz

Vor ngMessages wir die Validierungsnachrichten normalerweise mit vordefinierten Anweisungen von Angular ng-class Dieser Ansatz war Wurf und eine sich repetitive Aufgabe.

Mit ngMessages wir jetzt eigene benutzerdefinierte Nachrichten erstellen.

Beispiel

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";
});

Benutzerdefinierte Formularüberprüfung

In einigen Fällen reicht die grundlegende Validierung nicht aus. Angular unterstützt die benutzerdefinierte Validierung, um dem $validators ngModelController Objekt auf dem ngModelController $validators 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; 
        };
      } 
    };

Der Validator ist als eine Direktive definiert, für die ngModel erforderlich ist. ngModel den Validator anwenden ngModel , fügen Sie einfach die benutzerdefinierte Direktive zum Eingabeformularsteuerelement hinzu.

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

Und my-validator muss nicht auf die native Formularsteuerung angewendet werden. Es kann ein beliebiges Element sein, solange es in seinen Attributen ein ng-model . Dies ist nützlich, wenn Sie über eine benutzerdefinierte UI-Komponente verfügen.

Beispiel

Verschachtelte Formulare

Manchmal ist es wünschenswert, Formulare zu verschachteln, um Steuerelemente und Eingaben logisch auf der Seite zu gruppieren. HTML5-Formulare sollten jedoch nicht geschachtelt werden. Winkel liefert stattdessen 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>

Jeder Teil des Formulars trägt zum Gesamtzustand des Formulars bei. Wenn also einer der Eingaben myInput1 bearbeitet wurde und $dirty , ist das enthaltene Formular ebenfalls $dirty . myNestedForm dies zu jedem Formular führt, werden sowohl myNestedForm als auch myForm $dirty .

Async-Validatoren

Mit asynchronen Validatoren können Sie Formularinformationen gegen Ihr Backend überprüfen (mithilfe von $ http).

Diese Art von Validatoren wird benötigt, wenn Sie auf vom Server gespeicherte Informationen zugreifen müssen, die Sie aus verschiedenen Gründen nicht auf Ihrem Client haben können, z.

Um async-Validatoren zu verwenden, greifen Sie auf das ng-model Ihrer input und definieren Callback-Funktionen für die $asyncValidators Eigenschaft.

Beispiel:

Im folgenden Beispiel wird geprüft, ob ein angegebener Name bereits vorhanden ist. Das Backend gibt einen Status zurück, der das Versprechen ablehnt, wenn der Name bereits existiert oder nicht angegeben wurde. Wenn der Name nicht existiert, wird ein gelöstes Versprechen zurückgegeben.

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
     }
};

Bei jeder Änderung des ng-model der Eingabe wird diese Funktion ausgeführt und ein Versprechen mit dem Ergebnis zurückgegeben.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow