Walidacja formularza AngularJS przy przesyĆaniu: $dirty, $valid i $invalid
⥠Inteligentne podsumowanie
Walidacja formularzy w AngularJS sprawdza, czy dane wprowadzone do formularza sÄ poprawne i kompletne, zanim dotrÄ do serwera. W tym artykule omĂłwione sÄ cztery podejĆcia, od prostych atrybutĂłw HTML5, przez wĆaĆciwoĆci zakresu, po moduĆy automatycznej walidacji.

Walidacja formularzy w AngularJS
Walidacja formularza W AngularJS proces ten sprawdza, czy dane wprowadzone do formularza sÄ poprawne i kompletne. Gdy uĆŒytkownik przesyĆa formularz, walidacja odbywa siÄ najpierw, zanim dane zostanÄ przesĆane na serwer. Proces walidacji zapewnia, w jak najwiÄkszym stopniu, ĆŒe pola wejĆciowe zostaĆy wypeĆnione prawidĆowo.
W przykĆadzie z ĆŒycia wziÄtym, zaĆĂłĆŒmy, ĆŒe strona wymaga wypeĆnienia formularza rejestracyjnego przed udzieleniem peĆnego dostÄpu. Strona rejestracyjna zawieraĆaby pola wprowadzania nazwy uĆŒytkownika, hasĆa, adresu e-mail itd.
Na przykĆad adres e-mail zawsze musi byÄ w formacie nazwa uĆŒytkownika@strona.domenaJeĆli ktoĆ wprowadzi tylko nazwÄ uĆŒytkownika, walidacja powinna zakoĆczyÄ siÄ niepowodzeniem. Walidacja przeprowadza te podstawowe sprawdzenia przed wysĆaniem danych na serwer w celu dalszego przetworzenia.
â ïž Uwaga dotyczÄ ca wersji: AngularJS (odmiana 1.x) zakoĆczyĆ wsparcie techniczne 31 grudnia 2021 roku i nie otrzymuje juĆŒ ĆŒadnych poprawek bezpieczeĆstwa. PoniĆŒsze techniki pozostajÄ poprawne dla starszych aplikacji; wspĂłĆczesny Angular radzi sobie z tym samym zadaniem w przypadku formularzy opartych na szablonach lub reaktywnych.
Walidacja formularza przy uĆŒyciu HTML5
Walidacja formularza to proces wstÄpnej walidacji informacji wprowadzonych do formularza internetowego przed ich wysĆaniem na serwer. Walidacja po stronie klienta jest preferowana, poniewaĆŒ wiÄ ĆŒe siÄ z duĆŒo mniejszym obciÄ ĆŒeniem niĆŒ ponowne wyĆwietlanie formularza po kaĆŒdej prĂłbie.
PoniĆŒszy przykĆad przedstawia prosty formularz rejestracyjny, w ktĂłrym uĆŒytkownik wprowadza nazwÄ uĆŒytkownika, hasĆo, adres e-mail i wiek. Formularz zawiera mechanizmy kontroli poprawnoĆci, ktĂłre zapewniajÄ poprawne wprowadzenie danych.
<!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>
â ïž Wprowadzono poprawki do kaĆŒdego wpisu na tej stronie. OryginaĆy zadeklarowane chrset="UTF 8", ktĂłry nie jest ani prawidĆowym atrybutem, ani prawidĆowym kodowaniem i zaĆadowaĆ AngularJS trzy razy â angular-route.js po pierwsze, co powoduje bĆÄ
d, poniewaĆŒ moduĆ trasy rejestruje siÄ w ramach, ktĂłre nie zostaĆo zaĆadowane, a nastÄpnie angular.min.js oraz angular.js, ta sama biblioteka dwa razy. WyciÄ
gnÄli teĆŒ bootstrap.css przez <script> tag, wiÄc ĆŒaden styl nie zostaĆ zastosowany. KaĆŒdy wpis Ćaduje teraz jednÄ
bibliotekÄ w wersji 1.8.3 i poprawnie ĆÄ
czy arkusz stylĂłw. WypeĆnienie ukĆadu zbudowane z powtarzajÄ
cych siÄ jednostki zostaĆy usuniÄte.
Code WyjaĆnienie
- W przypadku wprowadzania tekstu
requiredAtrybut ten oznacza, ĆŒe ââpole tekstowe nie moĆŒe byÄ puste w momencie wysyĆania formularza. - NastÄpnym typem danych wejĆciowych jest hasĆo. PoniewaĆŒ typ jest oznaczony jako hasĆo, tekst wprowadzany w polu jest maskowany.
- PoniewaĆŒ typ danych wejĆciowych okreĆlono jako e-mail, tekst w polu musi byÄ zgodny ze wzorcem nazwa@witryna.domena.
- JeĆli typ danych wejĆciowych jest oznaczony jako liczba, znaki wpisywane z klawiatury po prostu nie sÄ akceptowane przez pole.
WydajnoĆÄ
Aby zobaczyÄ walidacjÄ w akcji, kliknij PrzeĆlij bez wprowadzania ĆŒadnych danych.
Pojawia siÄ okno dialogowe informujÄ ce, ĆŒe pole musi zostaÄ wypeĆnione, wiÄc kontrolka oznaczona jako wymagana blokuje przesĆanie, gdy pole pozostanie puste.
Wprowadzenie wartoĆci w polu hasĆa powoduje wyĆwietlenie symbolu â*â maskujÄ cego znaki.
Podanie nieprawidĆowego adresu e-mail i klikniÄcie przycisku âPrzeĆlijâ powoduje wyĆwietlenie okna z proĆbÄ o wpisanie symbolu @. Ostatecznie znaki wpisane w polu âWiekâ nigdy siÄ nie pojawiajÄ , poniewaĆŒ pole akceptuje tylko cyfry.
WyskakujÄ ce okienka w przeglÄ darce sÄ szybkie w konfiguracji, ale ich treĆÄ i styl nie mogÄ zostaÄ zmienione. Tutaj rolÄ odgrywajÄ wĆaĆciwoĆci walidacyjne AngularJS.
Walidacja formularza za pomocÄ $dirty, $valid, $invalid, $pristine
angularjs dostarcza wĆasne wĆaĆciwoĆci do walidacji. NastÄpujÄ ce wĆaĆciwoĆci sÄ udostÄpniane dla kaĆŒdej nazwanej kontrolki:
- $brudne â UĆŒytkownik wszedĆ w interakcjÄ z kontrolkÄ
- $waĆŒne â ZawartoĆÄ pola jest prawidĆowa
- $nieprawidĆowy â ZawartoĆÄ pola jest nieprawidĆowa
- $nieskazitelny â UĆŒytkownik nie wszedĆ jeszcze w interakcjÄ z kontrolkÄ
PoniĆŒej przedstawiono kroki umoĆŒliwiajÄ ce przeprowadzenie walidacji AngularJS.
Krok 1) UĆŒyj novalidate WĆaĆciwoĆÄ ta jest uĆŒywana podczas deklarowania formularza. Informuje ona przeglÄ
darkÄ, ĆŒe walidacjÄ
zajmie siÄ AngularJS.
Krok 2) Upewnij siÄ, ĆŒe formularz ma zdefiniowanÄ nazwÄ, poniewaĆŒ nazwa ta jest uĆŒywana do osiÄ gniÄcia stanu walidacji.
Krok 3) Upewnij siÄ, ĆŒe kaĆŒdy element sterujÄ
cy ma rĂłwnieĆŒ name atrybut, z tego samego powodu. Kontrolka bez nazwy nigdy nie jest rejestrowana w formularzu.
Krok 4) UĆŒyj ng-pokaĆŒ Dyrektywa sprawdzajÄ ca wĆaĆciwoĆci $dirty, $invalid i $valid.
PoniĆŒszy przykĆad zawiera pojedyncze pole tekstowe, w ktĂłrym uĆŒytkownik wpisuje nazwÄ tematu. JeĆli pole pozostanie puste, wygenerowany zostanie bĆÄ d walidacji i wyĆwietlony zostanie komunikat.
<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>
â ïž Poprawiono dwa bĆÄdy logiczne. OryginaĆ wyĆÄ
czyĆ przycisk za pomocÄ
ng-disabled="myForm.user.$dirty && myForm.user.$invalid", Bo $dirty jest faĆszywe, dopĂłki uĆŒytkownik nie dotknie pola, przycisk pozostaje wciĆniÄty wĆÄ
czony na nienaruszonym, pustym formularzu, dokĆadnie w tym przypadku, w ktĂłrym miaĆ zostaÄ zablokowany; myForm.$invalid obejmuje oba. OryginaĆ zawieraĆ rĂłwnieĆŒ wartoĆÄ domyĆlnÄ
$scope.Display = function () { $scope.user = 'Angular'; }, funkcja nigdy nie zostaĆa wywoĆana, wiÄc pole tekstowe otworzyĆo siÄ puste, mimo ĆŒe w tekĆcie widniaĆ napis âAngularJSâ. Przypisanie jest teraz wykonywane bezpoĆrednio, z wartoĆciÄ
w cudzysĆowie.
Code WyjaĆnienie
- Formularzowi nadano nazwÄ âmyFormâ. Jest to wymagane w celu uzyskania dostÄpu do jego elementĂłw sterujÄ cych w celu walidacji.
-
novalidateWĆaĆciwoĆÄ zatrzymuje sprawdzanie poprawnoĆci przez przeglÄ darkÄ, wiÄc AngularJS moĆŒe to zrobiÄ zamiast niej. - Dyrektywa ng-show sprawdza wĆaĆciwoĆci â$dirtyâ i â$invalidâ. JeĆli pole tekstowe zostaĆo zmodyfikowane, $dirty ma wartoĆÄ true; jeĆli jego wartoĆÄ jest pusta, $invalid ma wartoĆÄ true. Gdy obie wartoĆci majÄ wartoĆÄ true, wyĆwietlany jest obszar span z czerwonym tekstem.
- ZagnieĆŒdĆŒone sprawdzenie odczytuje wĆaĆciwoĆÄ â$error.requiredâ, ktĂłra ma wartoĆÄ true, jeĆli wymagany element sterujÄ cy nie ma wartoĆci, i wyĆwietla komunikat âNazwa uĆŒytkownika jest wymaganaâ.
- Przycisk WyĆlij jest wyĆÄ
czony przez
ng-disabledjeĆli formularz jako caĆoĆÄ jest niewaĆŒny. - Kontroler ustawia poczÄ tkowÄ wartoĆÄ pola tekstowego na âAngularJSâ, dziÄki czemu formularz otwiera siÄ w prawidĆowym stanie, a walidacjÄ Ćatwiej obserwowaÄ, gdy tekst zostaje usuniÄty.
WydajnoĆÄ
Po pierwszym wyĆwietleniu formularza w polu tekstowym pojawia siÄ napis âAngularJSâ, a przycisk âWyĆlijâ jest aktywny. Po usuniÄciu tekstu pojawia siÄ komunikat o bĆÄdzie, a przycisk jest nieaktywny.
Zrzut ekranu powyĆŒej pokazuje dwie rzeczy:
- Przycisk âWyĆlijâ jest wyĆÄ czony
- W polu tekstowym Temat nie ma nazwy tematu, dlatego wyĆwietla siÄ komunikat o bĆÄdzie âNazwa uĆŒytkownika jest wymaganaâ
Jak wyĆwietliÄ bĆÄdy walidacji za pomocÄ ngMessages
PowyĆŒszy wzĂłr dziaĆa, ale nie jest skalowalny. Pole z czterema ograniczeniami wymaga czterech zagnieĆŒdĆŒonych ng-show rozpiÄtoĆci, a gdy kilka z nich zawiedzie jednoczeĆnie, wszystkie wiadomoĆci pojawiajÄ
siÄ razem. ngMessages ModuĆ, dostarczany oddzielnie przez zespĂłĆ AngularJS, rozwiÄ
zuje oba problemy: wyĆwietla jednÄ
wiadomoĆÄ na raz, w kolejnoĆci, w jakiej zostaĆy napisane.
ZaĆaduj moduĆ i dodaj go jako zaleĆŒnoĆÄ.
<script src="https://code.angularjs.org/1.8.3/angular-messages.js"></script> <script> angular.module("DemoApp", ["ngMessages"]); </script>
W takim przypadku znaczniki sÄ traktowane jako lista reguĆ, a nie jako stos warunkĂłw.
<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>
Trzy szczegĂłĆy sprawiajÄ
, ĆŒe w praktyce sprawdza siÄ to dobrze. ng-messages punkty atrybutĂłw w kontrolce $error obiekt, a nie wartoĆÄ logiczna, wiÄc ĆŒaden warunek nie musi byÄ powtarzany. Tylko pierwsze pasujÄ
ce ng-message renderuje, co oznacza, ĆŒe ââpuste pole zgĆasza, ĆŒe ââjest wymagane, zamiast dodatkowo narzekaÄ na jego dĆugoĆÄ. Dodawanie ng-messages-multiple odwraca to zachowanie, gdy kaĆŒda awaria naprawdÄ musi zostaÄ wymieniona.
OwiĆping blok w ng-if="myForm.user.$dirty" utrzymuje formularz w stanie wyciszenia, dopĂłki uĆŒytkownik nie wpisze czegoĆ. ZastÄ
pienie $touched dla $dirty opĂłĆșnia przesĆanie wiadomoĆci do momentu, aĆŒ fokus opuĆci pole, co jest zazwyczaj wygodniejszym wyborem w przypadku dĆugiego formularza rejestracyjnego.
Jedno zastrzeĆŒenie: ngMessages jest dostarczany jako osobny plik, wiÄc zapomnienie znacznika skryptu lub zaleĆŒnoĆci moduĆu spowoduje, ĆŒe blok nie bÄdzie generowaĆ niczego, a w konsoli nie pojawi siÄ ĆŒaden bĆÄ
d objaĆniajÄ
cy ten fakt.
Pisanie wiadomoĆci rÄcznie jest precyzyjne, ale powtarzalne. W nastÄpnej sekcji omĂłwimy moduĆ, ktĂłry generuje je automatycznie.
Walidacja formularza za pomocÄ AngularJS Auto Validate
AngularJS moĆŒe automatycznie walidowaÄ wszystkie kontrolki w formularzu, bez koniecznoĆci uĆŒywania niestandardowego kodu do walidacji i wyĆwietlania komunikatĂłw o bĆÄdach. Odbywa siÄ to poprzez doĆÄ czenie moduĆu spoĆecznoĆciowego o nazwie âjcs-autoValidateâ.
DziÄki temu moduĆowi nie jest potrzebny ĆŒaden specjalny kod do uruchomienia walidacji lub wyĆwietlenia komunikatĂłw; wszystkim zajmuje siÄ moduĆ jcs-autoValidate.
PoniĆŒszy przykĆad przedstawia prosty formularz z jednym wymaganym polem tekstowym. JeĆli kontrolka nie zostanie wypeĆniona, wyĆwietlany jest komunikat o bĆÄdzie.
<!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>
â ïž Poprawka: oryginaĆ zidentyfikowaĆ kontrolÄ za pomocÄ
id="user" tylko. jcs-autoValidate dociera do kontrolki przez formularz, wiÄc name Atrybut jest obowiÄ
zkowy i wiadomoĆÄ nigdy nie pojawiaĆa siÄ bez niego. OryginaĆ zaĆadowaĆ rĂłwnieĆŒ dwie rĂłĆŒne wersje AngularJS: 1.6.4 z Google CDN obok 1.6.9 i nigdy nie poĆÄ
czony Bootstrap chociaĆŒ przykĆad zaleĆŒy od jego form-group oraz form-control klasy do pozycjonowania tekstu bĆÄdu.
đĄ Uwaga: jcs-autoValidate to projekt spoĆecznoĆciowy, ktĂłry nie jest juĆŒ aktywnie utrzymywany. Nadal moĆŒna go uĆŒywaÄ w istniejÄ
cych aplikacjach AngularJS, ale wbudowana ngMessages podejĆcie pokazane wczeĆniej jest bezpieczniejszym wyborem w przypadku wszystkiego, co nowe.
Code WyjaĆnienie
- DoĆÄ czono skrypt âjcs-auto-validate.jsâ, ktĂłry zawiera wszystkie funkcje automatycznej walidacji.
- KaĆŒdy element sterujÄ cy i otaczajÄ cy go element div umieszczane sÄ wewnÄ trz klasy âform-groupâ, do ktĂłrej moduĆ wstrzykuje swĂłj komunikat.
- Kontrolka zawiera zarĂłwno identyfikator, jak i
name, Bootstrap dostarczaform-controlstylizacja. - ModuĆ âjcs-autoValidateâ jest wymieniony jako zaleĆŒnoĆÄ moduĆu AngularJS.
WydajnoĆÄ
DomyĆlnie formularz jest renderowany dokĆadnie tak, jak zostaĆ napisany.
Po przesĆaniu pustego formularza pojawia siÄ komunikat âTo pole jest wymaganeâ, wygenerowany w caĆoĆci przez jcs-autoValidate. Po zatwierdzeniu formularza, pytaniem pozostaje, co uĆŒytkownik zobaczy podczas wysyĆania.
Informacje zwrotne od uĆŒytkownikĂłw za pomocÄ przyciskĂłw Ladda
Przyciski âLaddaâ to struktura zbudowana na JAVASCRIPT ktĂłra nadaje przyciskom efekt wizualny po ich naciĆniÄciu.
JeĆli przyciskowi zostanie nadany atrybut âladdaâ i naciĆniÄty, pojawi siÄ efekt wirowania. DostÄpne sÄ rĂłĆŒne style danych dla dodatkowych efektĂłw wizualnych.
PoniĆŒszy przykĆad pokazuje prosty formularz z przyciskiem âWyĆlijâ. Po naciĆniÄciu przycisku pojawia siÄ na nim efekt wirowania.
<!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>
â ïž Poprawka: oryginaĆ zaĆadowany angular-ladda.js oraz angular-ladda.min.js together, co rejestruje ten sam moduĆ dwukrotnie i ponownie pobiera dwie wersje AngularJS. Wymieniono rĂłwnieĆŒ jcs-autoValidate jako zaleĆŒnoĆÄ, ktĂłrej ten przykĆad nigdy nie uĆŒywa. Tutaj zaĆadowano jednÄ
kopiÄ kaĆŒdej biblioteki.
Code WyjaĆnienie
- "ng-przeĆlijDyrektywa â wywoĆuje funkcjÄ o nazwie âsubmitâ, ktĂłra zmienia atrybut ladda przycisku.
- Atrybut ladda naleĆŒy do frameworka Ladda i dodaje efekt spinu. Jego wartoĆÄ jest powiÄ
zana z
submittingzmienna. - WĆaĆciwoĆÄ data-style to kolejny atrybut Ladda, ktĂłry wybiera inny efekt wizualny.
- Aby framework dziaĆaĆ, do aplikacji AngularJS naleĆŒy dodaÄ moduĆ 'angular-ladda'.
-
submittingZmienna jest inicjowana na false, wiÄc przycisk uruchamia siÄ bez efektu wirowania. - Funkcja Submit ustawia
submittingna wartoĆÄ true, co powoduje zastosowanie efektu. W rzeczywistej aplikacji zostanie on zresetowany do false po otrzymaniu odpowiedzi od serwera, w przeciwnym razie przycisk bÄdzie siÄ obracaĆ w nieskoĆczonoĆÄ.
WydajnoĆÄ
Gdy formularz jest wyĆwietlany po raz pierwszy, przycisk âWyĆlijâ jest widoczny w zwykĆej formie.
Po naciĆniÄciu przycisku submitting Zmienna jest ustawiona na wartoĆÄ true. Ta wartoĆÄ osiÄ
ga atrybut âladdaâ przycisku, wywoĆujÄ
c efekt wirowania.














