Szukaj…


Podstawowa walidacja formularza

Jedną z mocnych stron Angulara jest walidacja formularza po stronie klienta.

Radzenie sobie z tradycyjnymi danymi wejściowymi formularzy i koniecznością korzystania z zapytania w stylu jQuery może być czasochłonne i wymagające. Angular pozwala stosunkowo łatwo tworzyć profesjonalne interaktywne formularze.

Dyrektywa ng-model zapewnia dwukierunkowe wiązanie z polami wejściowymi, a zwykle atrybut novalidate jest również umieszczany w elemencie formularza, aby uniemożliwić przeglądarce natywną weryfikację.

Tak więc prosta forma wyglądałaby następująco:

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

Aby sprawdzać poprawność danych wejściowych w Angular, użyj dokładnie tej samej składni, co zwykły element wejściowy , z wyjątkiem dodania atrybutu ng-model w celu określenia, z którą zmienną należy się wiązać w zakresie. Adres e-mail jest pokazany w poprzednim przykładzie. Aby sprawdzić poprawność liczby, składnia powinna wyglądać następująco:

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

Ostatnie kroki do sprawdzania poprawności formularza podstawowego łączą się z funkcją przesyłania formularza na kontrolerze za pomocą ng-upload , zamiast pozwalać na przesłanie domyślnego formularza. Nie jest to obowiązkowe, ale zwykle jest używane, ponieważ zmienne wejściowe są już dostępne w zakresie, a więc dostępne dla funkcji przesyłania. Zazwyczaj dobrą praktyką jest nadawanie formie nazwy. Zmiany te spowodowałyby następującą składnię:

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

Powyższy kod jest funkcjonalny, ale jest jeszcze inna funkcjonalność, którą zapewnia Angular.

Następnym krokiem jest zrozumienie, że Angular dołącza atrybuty klas do przetwarzania formularzy za pomocą ng-pristine , ng-dirty , ng-valid i ng-invalid . Używanie tych klas w twoim css pozwoli ci stylizować poprawne / nieprawidłowe i nieskazitelne / brudne pola wprowadzania, a tym samym zmieniać prezentację, gdy użytkownik wprowadza dane do formularza.

Stany formularza i wejściowe

Formy kątowe i dane wejściowe mają różne stany, które są przydatne podczas sprawdzania poprawności treści

Stany wejściowe

Stan Opis
$touched Pole zostało dotknięte
$untouched Pole nie zostało dotknięte
$pristine Pole nie zostało zmodyfikowane
$dirty Pole zostało zmodyfikowane
$valid Zawartość pola jest poprawna
$invalid Zawartość pola jest nieprawidłowa

Wszystkie powyższe stany są właściwościami logicznymi i mogą być prawdziwe lub fałszywe.

Dzięki nim wyświetlanie wiadomości do użytkownika jest bardzo łatwe.

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

W tym przypadku używamy dyrektywy ng-show do wyświetlania wiadomości użytkownikowi, jeśli zmodyfikował formularz, ale jest on nieprawidłowy.

Klasy CSS

Angular zapewnia również niektóre klasy CSS dla formularzy i danych wejściowych w zależności od ich stanu

Klasa Opis
ng-touched Pole zostało dotknięte
ng-untouched Pole nie zostało dotknięte
ng-pristine Pole nie zostało zmodyfikowane
ng-dirty Pole zostało zmodyfikowane
ng-valid Pole jest poprawne
ng-invalid Pole jest nieprawidłowe

Możesz użyć tych klas, aby dodać style do formularzy

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

ngMessages

ngMessages służy do ulepszenia stylu wyświetlania komunikatów sprawdzania poprawności w widoku.

Tradycyjne podejście

Przed ngMessages zwykle wyświetlamy komunikaty sprawdzania poprawności za pomocą wstępnie zdefiniowanych instrukcji Angular ng-class . Podejście to było śmieciem i repetitive zadaniem.

Teraz, korzystając z ngMessages , możemy tworzyć własne niestandardowe wiadomości.

Przykład

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

Weryfikacja formularza niestandardowego

W niektórych przypadkach podstawowa walidacja nie wystarczy. Obsługa kątowego niestandardowego sprawdzania poprawności, dodając funkcje sprawdzania poprawności do obiektu $validators na 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; 
        };
      } 
    };

Walidator jest zdefiniowany jako dyrektywa wymagająca ngModel , więc aby zastosować walidator, po prostu dodaj niestandardową dyrektywę do kontrolki formularza wejściowego.

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

A my-validator nie musi być stosowany do natywnej kontroli formularza. Mogą to być dowolne elementy, o ile mają w swoich atrybutach ng-model . Jest to przydatne, gdy masz niestandardowy komponent interfejsu użytkownika.

przykład

Zagnieżdżone formularze

Czasami pożądane jest zagnieżdżanie formularzy w celu logicznego grupowania kontrolek i danych wejściowych na stronie. Jednak formularze HTML5 nie powinny być zagnieżdżane. Zamiast tego dostarczana jest ng-form kątowa.

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

Każda część formularza ma wpływ na ogólny stan formularza. Dlatego jeśli jedno z danych wejściowych myInput1 zostało edytowane i jest $dirty , jego forma zawierająca będzie również $dirty . Spowoduje to kaskadowanie do każdej zawierającej formy, więc zarówno myNestedForm jak i myForm będą $dirty .

Walidatory asynchroniczne

Asynchroniczne sprawdzania poprawności umożliwia sprawdzanie poprawności informacji o formularzu w oparciu o backend (za pomocą $ http).

Tego rodzaju walidatory są potrzebne, gdy chcesz uzyskać dostęp do informacji przechowywanych na serwerze, których nie możesz mieć na kliencie z różnych powodów, takich jak tabela użytkowników i inne informacje z bazy danych.

Aby użyć walidatorów asynchronicznych, uzyskujesz dostęp do ng-model swojego input i definiujesz funkcje zwrotne dla właściwości $asyncValidators .

Przykład:

Poniższy przykład sprawdza, czy podana nazwa już istnieje, backend zwróci status, który odrzuci obietnicę, jeśli nazwa już istnieje lub jeśli nie została podana. Jeśli nazwa nie istnieje, zwróci rozwiązaną obietnicę.

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

Teraz za każdym razem, gdy zmieniany jest ng-model wejścia, ta funkcja będzie działać i zwróci obietnicę z wynikiem.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow