Sök…


Grundläggande formulärvalidering

En av Angular styrka är validering av klientsidan.

Att hantera traditionella inmatningar och att behöva använda förhörande jQuery-bearbetning kan vara tidskrävande och fin. Angular låter dig producera professionella interaktiva former relativt enkelt.

Direktivet ng-modell ger tvåvägsbindning med inmatningsfält och vanligtvis placeras attributet novalidat också på formelementet för att förhindra att webbläsaren gör en ursprunglig validering.

Således skulle en enkel form se ut:

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

För att Angular ska validera ingångar, använder du exakt samma syntax som ett vanligt inmatningselement , förutom tillägget av ng- modellattributet för att ange vilken variabel som ska bindas till omfånget. E-post visas i föregående exempel. För att validera ett nummer skulle syntaxen vara:

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

De sista stegen till grundläggande formulärvalidering är att ansluta till en formulär skicka funktion på styrenheten med ng-skicka , snarare än att låta standardformuläret skicka att ske. Detta är inte obligatoriskt men det används vanligtvis, eftersom inmatningsvariablerna redan finns tillgängliga inom ramen och så tillgängliga för din skicka-funktion. Det är också vanligtvis god praxis att ge formen ett namn. Dessa ändringar skulle resultera i följande syntax:

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

Denna kod ovan är funktionell men det finns annan funktionalitet som Angular tillhandahåller.

Nästa steg är att förstå att Angular bifogar klassattribut med ng-orörda , ng-smutsiga , ng-giltiga och ng-ogiltiga för formulärbehandling. Om du använder dessa klasser i din css kan du utforma giltiga / ogiltiga och orörda inmatningsfält och så ändra presentationen när användaren skriver in data i formuläret.

Form och inmatningsländer

Vinkelformer och ingångar har olika tillstånd som är användbara vid validering av innehåll

Inmatningsländer

stat Beskrivning
$touched Fältet har rörts
$untouched Fältet har inte rörts
$pristine Fältet har inte ändrats
$dirty Fältet har ändrats
$valid Fältinnehållet är giltigt
$invalid Fältinnehållet är ogiltigt

Alla ovanstående tillstånd är booleska egenskaper och kan vara antingen sanna eller falska.

Med dessa är det mycket enkelt att visa meddelanden till en användare.

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

Här använder vi ng-show direktivet för att visa ett meddelande till en användare om de har ändrat ett formulär men det är ogiltigt.

CSS-klasser

Angular tillhandahåller också vissa CSS-klasser för formulär och ingångar beroende på deras tillstånd

Klass Beskrivning
ng-touched Fältet har rörts
ng-untouched Fältet har inte rörts
ng-pristine Fältet har inte ändrats
ng-dirty Fältet har ändrats
ng-valid Fältet är giltigt
ng-invalid Fältet är ogiltigt

Du kan använda dessa klasser för att lägga till stilar i dina formulär

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

ngMessages

ngMessages används för att förbättra stilen för att visa valideringsmeddelanden i vyn.

Traditionell strategi

Innan ngMessages vi normalt valideringsmeddelanden med hjälp av vinkelfördefinierade direktiv ng-class Denna strategi var kull och en repetitive uppgift.

ngMessages använda ngMessages vi skapa egna egna meddelanden.

Exempel

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

Anpassad formvalidering

I vissa fall räcker inte grundvalidering. Angular support anpassad validering lägger till valideringsfunktioner i $validators objektet på 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; 
        };
      } 
    };

Validatorn definieras som ett direktiv som kräver ngModel , så för att tillämpa valideraren lägger du bara till det anpassade direktivet till ingångsformulärkontrollen.

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

Och my-validator behöver inte tillämpas på infödingskontroll. Det kan vara valfritt element, så länge det är som ng-model i dess attribut. Detta är användbart när du har en anpassad bygg ui-komponent.

exempel

Kapslade formulär

Ibland är det önskvärt att häcka formulär i syfte att gruppera kontroller och ingångar logiskt på sidan. HTML5-formulär bör dock inte kapslas. Angular levererar i stället 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>

Varje del av formen bidrar till den övergripande formens tillstånd. Därför, om en av ingångarna myInput1 har redigerats och är $dirty , kommer dess innehållsform också att vara $dirty . Denna kaskader till varje som innehåller form, så både myNestedForm och myForm kommer att vara $dirty .

Async-validerare

Med asynkrona validerare kan du validera formulärinformation mot din backend (med $ http).

Denna typ av validerare behövs när du behöver åtkomst till serverlagrad information som du inte kan ha om din klient av olika skäl, till exempel användartabellen och annan databasinformation.

För att använda async-validerare, öppnar du ng-model för din input och definierar återuppringningsfunktioner för egenskapen $asyncValidators .

Exempel:

Följande exempel kontrollerar om ett angivet namn redan finns, backend kommer att returnera en status som kommer att avvisa löfte om namnet redan finns eller om det inte gick. Om namnet inte finns kommer det att lösa ett löst löft.

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

Nu varje gång ng-model för ingången ändras, kommer denna funktion att köras och ger ett löfte med resultatet.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow