Validacija AngularJS obrasca prilikom slanja: $dirty, $valid i $invalid
โก Pametni saลพetak
Validacija obrasca u AngularJS-u provjerava jesu li podaci uneseni u obrazac ispravni i potpuni prije nego ลกto stignu do posluลพitelja. Ovdje su obraฤena ฤetiri pristupa, od obiฤnih HTML5 atributa, preko svojstava opsega do automatskih modula za validaciju.

Validacija obrazaca u AngularJS
Provjera obrasca U AngularJS-u je to proces kojim se osigurava da su podaci uneseni u obrazac toฤni i potpuni. Kada korisnik poลกalje obrazac, prvo se provodi validacija, prije nego ลกto se podaci poลกalju posluลพitelju. Proces validacije osigurava, u najboljoj moguฤoj mjeri, da su polja za unos ispravno popunjena.
U primjeru iz stvarnog svijeta, pretpostavimo web-mjesto koje zahtijeva ispunjavanje registracijskog obrasca prije odobravanja punog pristupa. Stranica za registraciju imala bi polja za unos korisniฤkog imena, lozinke, e-poลกte i tako dalje.
Na primjer, adresa e-poลกte uvijek mora biti u formatu korisniฤkoime@site.domenaAko netko unese samo korisniฤko ime, validacija ne bi trebala uspjeti. Validacija provodi ove osnovne provjere prije nego ลกto se podaci poลกalju posluลพitelju na daljnju obradu.
โ ๏ธ Napomena o verziji: AngularJS (grana 1.x) dosegao je kraj svog ลพivotnog vijeka 31. prosinca 2021. i ne prima daljnje sigurnosne zakrpe. Tehnike u nastavku ostaju ispravne za naslijeฤene aplikacije; moderni Angular obavlja isti posao s obrascima voฤenim predloลกcima ili reaktivnim obrascima.
Provjera valjanosti obrasca pomoฤu HTML5
Validacija obrasca je proces prethodne provjere valjanosti podataka unesenih u web obrazac prije slanja na posluลพitelj. Validacija na strani klijenta je poลพeljnija jer dodaje daleko manje optereฤenja nego ponovno predstavljanje obrasca nakon kruลพnog putovanja.
Primjer u nastavku prikazuje jednostavan obrazac za registraciju u koji korisnik unosi korisniฤko ime, lozinku, adresu e-poลกte i dob. Obrazac sadrลพi kontrole validacije koje osiguravaju da su podaci ispravno uneseni.
<!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>
โ ๏ธ Ispravci su primijenjeni na svaki oglas na ovoj stranici. Originali su deklarirani chrset="UTF 8", ลกto nije ni valjani atribut ni valjano kodiranje, i uฤitalo je AngularJS tri puta โ angular-route.js prvo, ลกto izbacuje greลกku jer se modul rute registrira na okviru koji se nije uฤitavao, zatim angular.min.js i angular.js, istu knjiลพnicu dva puta. Takoฤer su izvukli bootstrap.css kroz <script> oznaka, tako da stiliziranje nikada nije primijenjeno. Svaki unos sada uฤitava jednu biblioteku, verziju 1.8.3, i ispravno povezuje stilski list. Rasporeฤivanje izgleda izgraฤeno od ponovljenih entiteti su uklonjeni.
Code Objaลกnjenje
- Za vrstu unosa teksta,
requiredAtribut znaฤi da tekstualno polje ne moลพe biti prazno prilikom slanja obrasca. - Sljedeฤa vrsta unosa je lozinka. Buduฤi da je vrsta oznaฤena kao lozinka, tekst unesen u polje je maskiran.
- Buduฤi da je vrsta unosa navedena kao e-poลกta, tekst u okviru mora odgovarati uzorku ime@site.domena.
- Kada je vrsta unosa oznaฤena kao broj, polje jednostavno ne prihvaฤa znakove unesene s tipkovnice.
Izlaz
Da biste vidjeli validaciju u akciji, kliknite Poลกalji bez unosa iฤega.
Pojavljuje se skoฤni prozor s obavijesti da polje treba popuniti, pa kontrola oznaฤena kao obavezna blokira slanje ako je polje prazno.
Unosom vrijednosti u polje za lozinku prikazuje se simbol '*' koji maskira znakove.
Unosom neispravne adrese e-poลกte i klikom na Poลกalji otvara se skoฤni prozor s upitom za simbol @. Konaฤno, znakovi upisani u polje za dob nikada se ne pojavljuju jer polje prihvaฤa samo brojeve.
Skoฤni prozori u pregledniku se brzo postavljaju, ali njihov tekst i stil se ne mogu mijenjati. Tu preuzimaju AngularJS svojstva validacije.
Provjera valjanosti obrasca pomoฤu $dirty, $valid, $invalid, $pristine
AngularJS pruลพa vlastita svojstva za validaciju. Sljedeฤa svojstva su izloลพena na svakoj imenovanoj kontroli:
- $prljavo โ Korisnik je stupio u interakciju s kontrolom
- $vaลพeฤi โ Sadrลพaj polja je valjan
- $nevaลพeฤi โ Sadrลพaj polja je nevaลพeฤi
- $netaknuta โ Korisnik joลก nije stupio u interakciju s kontrolom
U nastavku su navedeni koraci za provoฤenje AngularJS validacije.
Korak 1) Koristite novalidate svojstvo prilikom deklariranja obrasca. To govori pregledniku da ฤe AngularJS obraditi validaciju.
Korak 2) Provjerite ima li obrazac definiran naziv jer se taj naziv koristi za postizanje stanja validacije.
Korak 3) Osigurajte da svaka kontrola takoฤer ima name atribut, iz istog razloga. Kontrola bez imena se nikada ne registrira na obrascu.
Korak 4) Koristite ng-show direktiva za provjeru svojstava $dirty, $invalid i $valid.
Primjer u nastavku ima jedno tekstualno polje u koje korisnik unosi naziv teme. Ako se ostavi prazno, aktivira se pogreลกka validacije i prikazuje se poruka.
<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>
โ ๏ธ Ispravljene dvije logiฤke pogreลกke. Izvornik je onemoguฤio gumb pomoฤu ng-disabled="myForm.user.$dirty && myForm.user.$invalid", Jer $dirty je laลพno dok korisnik ne dodirne polje, gumb ostaje omoguฤeno na netaknutom praznom obrascu, toฤno onaj sluฤaj koji je trebao blokirati; myForm.$invalid pokriva oboje. Izvornik je takoฤer zadao zadanu vrijednost u $scope.Display = function () { $scope.user = 'Angular'; }, funkcija koju niลกta nikada nije pozvalo, pa se okvir za tekst otvorio prazan unatoฤ tome ลกto je tekst tvrdio da prikazuje โAngularJSโ. Dodjela se sada vrลกi izravno, s vrijednoลกฤu koju okolni tekst navodi.
Code Objaลกnjenje
- Obrazac dobiva naziv โmyFormโ. To je potrebno kako bi se doลกlo do njegovih kontrola za validaciju.
- The
novalidatesvojstvo zaustavlja validaciju preglednika, tako da to umjesto toga moลพe uฤiniti AngularJS. - Direktiva ng-show provjerava svojstva โ$dirtyโ i โ$invalidโ. Ako je tekstualni okvir izmijenjen, $dirty je true; ako je njegova vrijednost prazna, $invalid je true. Kada su oba true, prikazuje se raspon s crvenim tekstom.
- Ugnijeลพฤena provjera ฤita svojstvo "$error.required", koje je istinito kad god obavezna kontrola nema vrijednost, i prikazuje "Korisniฤko ime je obavezno".
- Gumb za slanje je onemoguฤen putem
ng-disabledkad god je obrazac u cjelini nevaลพeฤi. - Kontroler postavlja poฤetnu vrijednost tekstnog okvira na โAngularJSโ, tako da se obrazac otvara u valjanom stanju i validacija je lakลกe uoฤiti dok se tekst briลกe.
Izlaz
Kada se obrazac prvi put prikaลพe, tekstualni okvir prikazuje โAngularJSโ i gumb za slanje je omoguฤen. ฤim se tekst ukloni, pojavljuje se poruka o pogreลกci i gumb je onemoguฤen.
Gornja snimka zaslona prikazuje dvije stvari:
- Gumb za slanje je onemoguฤen
- U tekstnom okviru Tema nema naziva teme, pa se prikazuje poruka o pogreลกci โKorisniฤko ime je obaveznoโ
Kako prikazati pogreลกke validacije pomoฤu ngMessages
Gornji uzorak funkcionira, ali se ne skalira. Polje s ฤetiri ograniฤenja treba ฤetiri ugnijeลพฤena ng-show rasponi, a kada nekoliko njih odjednom zakaลพe, sve poruke se pojavljuju zajedno. ngMessages Modul, koji AngularJS tim isporuฤuje zasebno, rjeลกava oba problema: prikazuje jednu poruku odjednom, redoslijedom kojim su poruke napisane.
Uฤitajte modul i dodajte ga kao ovisnost.
<script src="https://code.angularjs.org/1.8.3/angular-messages.js"></script> <script> angular.module("DemoApp", ["ngMessages"]); </script>
Oznaฤavanje se tada ฤita kao popis pravila, a ne kao skup uvjeta.
<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>
Tri detalja ฤine da se ovo dobro ponaลกa u praksi. ng-messages atributne toฤke na kontroli $error objekt, a ne na logiฤku vrijednost, tako da se nijedan uvjet ne mora ponavljati. Samo prvo podudaranje ng-message renderira, ลกto znaฤi da prazno polje izvjeลกtava da je obavezno umjesto da se takoฤer ลพali na njegovu duljinu. Dodavanje ng-messages-multiple preokreฤe to ponaลกanje kada svaki neuspjeh zaista treba biti naveden.
Zamotajteping blok u ng-if="myForm.user.$dirty" odrลพava obrazac tihim dok korisnik zapravo neลกto ne upiลกe. Zamjena $touched za $dirty dodatno odgaฤa poruku, sve dok fokus ne napusti polje, ลกto je obiฤno povoljniji izbor na dugim obrascima za registraciju.
Jedna upozorenje: ngMessages isporuฤuje se kao zasebna datoteka, pa zaboravljanje oznake skripte ili ovisnosti modula ostavlja blok bez ikakvog prikaza, bez ikakve konzolne pogreลกke koja bi to objasnila.
Ruฤno pisanje poruka je precizno, ali repetitivno. Sljedeฤi odjeljak pokriva modul koji ih automatski generira.
Provjera obrasca pomoฤu AngularJS Auto Validate
AngularJS moลพe automatski validirati sve kontrole na obrascu, bez prilagoฤenog koda za validaciju ili poruke o pogreลกkama. To se postiลพe ukljuฤivanjem zajedniฤkog modula pod nazivom โjcs-autoValidateโ.
S ovim modulom nije potreban poseban kod za pokretanje validacije ili prikaz poruka; sve se obraฤuje unutar jcs-autoValidate.
Primjer u nastavku ima jednostavan obrazac s jednim obaveznim tekstnim okvirom. Poruka o pogreลกci prikazuje se ako kontrola nije ispunjena.
<!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>
โ ๏ธ Ispravak: original je identificirao kontrolu s id="user" samo. jcs-autoValidate dolazi do kontrole putem obrasca, pa a name Atribut je obavezan i poruka se nikada nije pojavila bez njega. Izvornik je takoฤer uฤitavao dvije razliฤite verzije AngularJS-a, 1.6.4 iz Google CDN uz verziju 1.6.9 i nikad nije povezan Bootstrap iako primjer ovisi o njemu form-group i form-control klase za pozicioniranje teksta greลกke.
๐ก Napomena: jcs-autoValidate je projekt zajednice i viลกe se aktivno ne odrลพava. I dalje se moลพe koristiti na postojeฤim AngularJS aplikacijama, ali ugraฤena ngMessages Pristup prikazan ranije je sigurniji izbor za sve novo.
Code Objaลกnjenje
- Ukljuฤena je skripta โjcs-auto-validate.jsโ koja sadrลพi sve funkcionalnosti automatske validacije.
- Svaka kontrola i div koji je okruลพuje smjeลกteni su unutar klase "form-group", gdje modul ubrizgava svoju poruku.
- Kontrola nosi i ID i
namei Bootstrap opskrbljujeform-controlstil. - Modul โjcs-autoValidateโ naveden je kao ovisnost AngularJS modula.
Izlaz
Prema zadanim postavkama, obrazac se prikazuje toฤno onako kako je napisan.
Slanjem praznog obrasca prikazuje se poruka โOvo polje je obaveznoโ, koju je u potpunosti generirao jcs-autoValidate. Nakon ลกto se obrazac potvrdi, preostalo je pitanje ลกto korisnik vidi tijekom slanja.
Povratne informacije korisnika s Ladda gumbima
Gumbi โLaddaโ su okvir izgraฤen na vrhu JavaScript ลกto daje gumbima vizualni efekt kada se pritisnu.
Ako se gumbu dodijeli atribut โladdaโ i pritisne se, prikazuje se efekt rotacije. Za dodatne vizualne efekte dostupni su razliฤiti stilovi podataka.
Primjer u nastavku prikazuje jednostavan obrazac s gumbom za slanje. Kada se pritisne gumb, na njemu se pojavljuje efekt rotacije.
<!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>
โ ๏ธ Ispravak: original uฤitan angular-ladda.js i angular-ladda.min.js zajedno, ลกto dvaput registrira isti modul, i ponovno je povuklo dvije AngularJS verzije. Takoฤer je navelo jcs-autoValidate kao ovisnost koju ovaj primjer nikada ne koristi. Ovdje se uฤitava jedna kopija svake biblioteke.
Code Objaลกnjenje
- "ng-podnesiDirektiva โ poziva funkciju pod nazivom โsubmitโ koja mijenja atribut ladda gumba.
- Atribut ladda pripada Ladda okviru i dodaje efekt vrtnje. Njegova vrijednost vezana je uz
submittingpromjenjiva. - Svojstvo data-style je joลก jedan Ladda atribut koji odabire drugaฤiji vizualni efekt.
- Modul 'angular-ladda' mora biti dodan u AngularJS aplikaciju da bi okvir radio.
- The
submittingVarijabla je inicijalizirana na false, pa se gumb pokreฤe bez efekta okretanja. - Funkcija slanja postavlja
submittingna true, ลกto primjenjuje efekt. U stvarnoj aplikaciji bi se resetirao na false nakon ลกto posluลพitelj odgovori, inaฤe bi se gumb vrtio zauvijek.
Izlaz
Kada se obrazac prvi put prikaลพe, gumb za slanje prikazuje se u obiฤnom obliku.
Kada se pritisne gumb, submitting Varijabla je postavljena na true. Ta vrijednost doseลพe atribut "ladda" gumba, stvarajuฤi efekt vrtnje.














