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.

  • ๐Ÿงฉ HTML5 atributi: Obavezni atribut i tipovi unosa e-poลกte, lozinke i broja isporuฤuju provjere izvorne za preglednik bez skriptiranja.
  • ๐Ÿ” Drลพavna imovina: AngularJS izlaลพe $dirty, $pristine, $valid i $invalid na svakoj imenovanoj kontroli unutar imenovanog obrasca.
  • ๐Ÿท๏ธ Zahtjev za imenovanje: I obrazac i svaka kontrola trebaju atribut imena, jer se stanje validacije adresira kao obrazacNaziv.nazivkontrole.
  • ???? Suzbijanje izvornih skoฤnih prozora: Dodavanje novalidate obrascu sprjeฤava preglednik da presreฤ‡e slanje kako bi ga AngularJS mogao obraditi.
  • ๐Ÿ’ฌ Prikaz poruke: Modul ngMessages zamjenjuje sloลพene direktive ng-show i prikazuje jednu po jednu greลกku po prioritetu.
  • ๏ธ Automatska validacija: Modul jcs-autoValidate generira poruke o pogreลกci za svaku kontrolu bez ikakvog prilagoฤ‘enog oznaฤavanja.
  • ๐Ÿ”˜ Povratne informacije o slanju: Gumb Ladda aktivira rotirajuฤ‡i gumb dok je slanje u tijeku, signalizirajuฤ‡i korisniku napredak.

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 &nbsp; entiteti su uklonjeni.

Code Objaลกnjenje

  1. Za vrstu unosa teksta, required Atribut znaฤi da tekstualno polje ne moลพe biti prazno prilikom slanja obrasca.
  2. Sljedeฤ‡a vrsta unosa je lozinka. Buduฤ‡i da je vrsta oznaฤena kao lozinka, tekst unesen u polje je maskiran.
  3. Buduฤ‡i da je vrsta unosa navedena kao e-poลกta, tekst u okviru mora odgovarati uzorku ime@site.domena.
  4. 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

  1. Obrazac dobiva naziv โ€žmyFormโ€œ. To je potrebno kako bi se doลกlo do njegovih kontrola za validaciju.
  2. The novalidate svojstvo zaustavlja validaciju preglednika, tako da to umjesto toga moลพe uฤiniti AngularJS.
  3. 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.
  4. Ugnijeลพฤ‘ena provjera ฤita svojstvo "$error.required", koje je istinito kad god obavezna kontrola nema vrijednost, i prikazuje "Korisniฤko ime je obavezno".
  5. Gumb za slanje je onemoguฤ‡en putem ng-disabled kad god je obrazac u cjelini nevaลพeฤ‡i.
  6. 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

  1. Ukljuฤena je skripta โ€žjcs-auto-validate.jsโ€œ koja sadrลพi sve funkcionalnosti automatske validacije.
  2. Svaka kontrola i div koji je okruลพuje smjeลกteni su unutar klase "form-group", gdje modul ubrizgava svoju poruku.
  3. Kontrola nosi i ID i namei Bootstrap opskrbljuje form-control stil.
  4. 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

  1. "ng-podnesiDirektiva โ€ poziva funkciju pod nazivom โ€œsubmitโ€ koja mijenja atribut ladda gumba.
  2. Atribut ladda pripada Ladda okviru i dodaje efekt vrtnje. Njegova vrijednost vezana je uz submitting promjenjiva.
  3. Svojstvo data-style je joลก jedan Ladda atribut koji odabire drugaฤiji vizualni efekt.
  4. Modul 'angular-ladda' mora biti dodan u AngularJS aplikaciju da bi okvir radio.
  5. The submitting Varijabla je inicijalizirana na false, pa se gumb pokreฤ‡e bez efekta okretanja.
  6. Funkcija slanja postavlja submitting na 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.

Pitanja i odgovori

$dirty postaje true kada se vrijednost promijeni. $touched postaje true kada polje izgubi fokus. Koristite $touched za odgaฤ‘anje pogreลกke dok korisnik ne krene dalje, ลกto se ฤini manje agresivnim dok typing.

Dodajte direktivu ng-pattern s regularnim izrazom, na primjer ng-pattern=โ€/^[0-9]{6}$/โ€. Greลกka se zatim pojavljuje kao $error.pattern, ลกto ngMessages moลพe prijaviti kao i svako ugraฤ‘eno ograniฤenje.

Da. Alati umjetne inteligencije ฤitaju oznake i proizvode odgovarajuฤ‡e blokove required, ng-pattern i ngMessages. Uvijek pregledajte regularne izraze, buduฤ‡i da generirani obrasci e-poลกte i telefona ฤesto odbijaju valjani unos.

AI asistenti brzo provjeravaju tri uobiฤajena uzroka: nedostajuฤ‡i atribut name na obrascu ili kontroli, nedostajuฤ‡i ng-model i izostavljena `novalidate` kako bi preglednik prvi presreo slanje.

Ne. Poboljลกava iskustvo i smanjuje broj povratnih putovanja, ali svatko to moลพe zaobiฤ‡i pomoฤ‡u alata za razvojne programere. Svako pravilo provedeno u pregledniku mora se ponovno primijeniti na posluลพitelju.

Saลพmite ovu objavu uz: