ng-submit AngularJS-ben: Űrlapbeküldés kezelése egy példával

⚡ Okos összefoglaló

Az AngularJS-ben az ng-submit egy vezérlőfüggvényt köt az űrlap böngésző általi submit eseményéhez, így a beírt értékek a vezérlőn belül kerülnek feldolgozásra, és az oldal soha nem töltődik újra az alapértelmezett POST-on keresztül.

  • 🔘 Irányító szerep: Az ng-submit egy AngularJS kifejezést köt egy form elem submit eseményéhez.
  • ☑️ Nincs oldal újratöltése: Az alapértelmezett böngésző POST letiltásra kerül, kivéve, ha az űrlap rendelkezik egy action attribútummal.
  • Működő példa: Egy szövegdoboz és a Display() függvény minden témát az AllTopic tömbbe helyez be ng-repeat céljából.
  • 🧪 Érvényesítési kapu: A $valid, a novalidate és az ng-disabled paraméterek párosítása blokkolja a hiányos adatok beküldését.
  • 🇧🇷 Gyakori hiba: Az ng-submit melletti küldés gombra kattintva az ng-submit dupla küldést okoz.
  • 📊 Verzió megjegyzés: Az AngularJS támogatása 2022 januárjában megszűnt; a modern Angular az (ngSubmit)-en keresztül küldi be a kérelmet.

ng-submit direktíva az AngularJS-ben, amely egy űrlap submit eseményét egy vezérlőfüggvényhez köti

AngularJS ng-submit irányelv

Az ng-submit Az AngularJS direktívája az alkalmazásnak a böngésző elküldési eseményéhez való kötésére szolgál. Tehát abban az esetben AngularJS az elküldési eseménynél magán az adatkezelőn belül végezhet feldolgozást, majd megjelenítheti a feldolgozott információkat a felhasználónak.

Verzió megjegyzés: Az AngularJS 1.x 2021. december 31-én kilépett a hosszú távú támogatásból, és a keretrendszer csapata megerősítette ezt. Az AngularJS támogatása hivatalosan megszűnt 2022 januárjában, így nem jelentek meg kiadások vagy biztonsági javítások. Minden alábbi lépés és kódblokk pontosan a leírtak szerint kerül megőrzésre, a történelmi hivatkozásként. Az új munka a modern Angularban található, amely ugyanazt az elképzelést fejezi ki, mint a (ngSubmit) FormGroup-hoz kötve.

Űrlap beküldése AngularJS-ben az ng-submit használatával

A weboldalon található információk beküldésének folyamatait általában a webböngésző elküldési eseménye kezeli. Ezt az eseményt általában arra használják, hogy a felhasználó által a weboldalon megadott információkat továbbítsák a szervernek további feldolgozás céljából, mint például a bejelentkezési adatok, űrlapadatok stb. Az információk elküldése történhet GET vagy POST kéréssel.

Vegyünk egy szögletes űrlap beküldési példát, hogy megtudjuk, hogyan kell űrlapokat beküldeni az AngularJS-ben.

Az AngularJS űrlap beküldési példájában egy szövegdobozt fogunk bemutatni a felhasználónak, amelyben megadhatja a tanulni kívánt témát. Az oldalon lesz egy beküldés gomb, amit megnyomva a téma egy rendezetlen listára kerül.

Az alábbi illusztráció tracolyan elemek, amelyek a szövegmezőbe beírt témától a Küldés gombon keresztül az alatta hozzáfűzött listaelemig terjednek.

AngularJS űrlap téma szövegmezővel, Küldés gombbal és a kapott rendezetlen témalistával
Űrlap beküldése AngularJS-ben az ng-submit használatával

Példa AngularJS űrlap beküldésére

Most látni fogunk egy példát az AngularJS űrlap elküldésére a vezérlőtől az ng-submit direktíva használatával:

<!DOCTYPE html>
<html>
<head>

    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>

<body  ng-app="sampleApp">
<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="lib/bootstrap.js"></script>
<script src="lib/bootstrap.css"></script>
<h1> Guru99 Global Event</h1>
<div ng-controller="AngularController">

    <form ng-submit="Display()">
        &nbsp;&nbsp;&nbsp;
        Enter which topic you would like to learn
        <input type="text"  ng-app="sampleApp" ng-model="Topic"><br>

        <input type="submit" value="Submit"/>

        <ul ng-repeat="topicname in AllTopic">
            <li>{{topicname}}</li>
        </ul>
    </form>
</div>

<script>
   var sampleApp = angular.module("sampleApp",[]);

    sampleApp.controller("AngularController",function($scope) {
        $scope.AllTopic=[];
        $scope.Display = function () {
            $scope.AllTopic.push($scope.Topic);
        }
    });
</script>
</body>
</html>

Code Magyarázat:

  1. Először deklaráljuk az űrlap HTML-címkéjét, amely a „szövegmező” és a „küldés gomb” vezérlőelemeket fogja tartalmazni, ahogy az az Angular űrlap elküldési eseményének példájában látható. Ezután az ng-submit AngularJS direktívát használjuk a „Display()” függvény űrlapunkhoz kötéséhez. Ezt a függvényt a vezérlőnkben definiáljuk, és az űrlap elküldésekor hívjuk meg.
  2. Van egy szöveges vezérlőnk, amelyben a felhasználó beírja a tanulni kívánt témát. Ez egy „Téma” nevű változóhoz lesz kötve, amelyet a vezérlőnk használ.
  3. Az AngularJS-ben van egy normál beküldés gomb, amelyre a felhasználó rákattint, amikor beírta a kívánt témát.
  4. Használtuk a ng-ismétlés direktíva a felhasználó által beírt témakörök listaelemeinek megjelenítéséhez. Az ng-repeat direktíva végigmegy az 'AllTopic' tömb minden egyes témakörén, és ennek megfelelően jeleníti meg a téma nevét.
  5. A vezérlőnkben deklarálunk egy „AllTopic” nevű tömbváltozót. Ez a változó tárolja majd a felhasználó által a 2. lépésben megadott összes témát.
  6. Meghatározzuk a Display() függvényünk kódját, amely akkor kerül meghívásra, amikor a felhasználó a Küldés gombra kattint. Itt a push tömb funkciót használjuk, hogy a felhasználó által a „Téma” változón keresztül beírt témákat hozzáadjuk az „AllTopic” tömbünkhöz.

Ha az AngularJS űrlappéldakód sikeresen végrehajtásra került, a következő kimenet jelenik meg, amikor futtatja a kódot a böngészőben.
output:

Az AngularJS ng-submit példa böngészőkimenete, amelyen látható az üres témakör szövegmezője és a Küldés gomb

A kód működésének megtekintéséhez először adjon meg egy témanevet, például „Szögletes”, ahogy fent látható a szövegmezőben, majd kattintson a Küldés gombra.

Az AngularJS ng-submit kimenete a Küldés gombra kattintás után, a megadott téma hozzáadva a listához

  • A küldés gombra kattintás után megjelenik a szövegmezőbe beírt elem a tételek listájához.
  • Ezt a Display() függvény éri el, amely a küldés gomb megnyomásakor hívódik meg.
  • A Display() függvény hozzáadja a szöveget az 'AllTopic' nevű tömbváltozóhoz. Az ng-repeat direktívánk pedig végigmegy az 'AllTopic' tömbváltozó minden egyes értékén, és ennek megfelelően listaelemként jeleníti meg azokat.

ng-submit vs ng-click: melyiket használja

Mindkét AngularJS direktívák meghívhatják ugyanazt a vezérlőfüggvényt, mégis különböző böngészőeseményeket figyelnek. ng-submit ül a <form> címkét használ, és reagál a submit eseményre, így akkor is aktiválódik, amikor a felhasználó Entert nyom egy mezőn belül. ng-click egy gombon található, és csak egérkattintásra vagy azzal egyenértékű aktiválásra reagál.

Aspect ng-submit ng-kattintás
Gazdaelem Az űrlapcímke Bármely kattintható elem
Meghallgatott esemény elküldés, beleértve az Enter billentyűt is csak kattintás
Alapértelmezett böngésző POST Az irányelv által elnyomva Még mindig aktiválódik a küldés gombról
Hozzáférés az űrlap állapotához Beolvassa a $valid és $invalid értékeket az űrlapvezérlőn. Nincs saját űrlapkontextus
Természetes illeszkedés Űrlapadatok átadása egy vezérlőnek Eszköztár gombjai, linkek, modális triggerek

A billentyűzet támogatása általában eldönti a választást. Egy vezetékes űrlap ng-click önmagában figyelmen kívül hagyja az Enter billentyűt, ami bosszantó lehet a bejelentkezési mező kitöltésekor. ng-click olyan műveletekhez, amelyek nem űrlapbeküldések, például egy mező törlése vagy egy párbeszédpanel megnyitása.

Miért akadályozza meg az ng-submit az alapértelmezett böngésző általi elküldést?

Egy egyszerű HTML űrlap a beküldés eseményre úgy reagál, hogy szerializálja a mezőit, és arra kéri a böngészőt, hogy töltsön be egy új oldalt, amely elveti az összes benne tárolt értéket. $scope Az ng-submit az irányelv megakadályozza, hogy ez megtörténjen: felszólítja preventDefault() neked, így a kifejezés lefut, és az aktuális oldal a helyén marad. Nem $event argumentumra van szükség, és nincs szükség manuális hívásra.

Az elnyomásnak egyetlen dokumentált feltétele van. A ... szerint ngReferencia beküldése, az alapértelmezett művelet csak akkor tiltott, ha az űrlap nem tartalmaz action, data-action or x-action attribútum. Ha ezek bármelyikét hozzáadjuk, a böngésző a kezelő befejezése után a szokásos módon navigál, ami a helyes viselkedés egy fokozatosan továbbfejlesztett, szerver által renderelt űrlap esetében, és mindenhol máshol meglepetés.

Mivel az utasítás lenyeli az eseményobjektumot, olvassa be a beküldött értékeket a tulajdonságokból, amelyek ng-modell írta a hatókörbe, vagy explicit módon adta át őket, mint például a ng-submit="Display(Topic)".

Hogyan lehet érvényesíteni egy űrlapot az ng-submit futtatása előtt?

A fenti példa elfogad egy üres témát, mivel semmi sem ellenőrzi először a szövegdobozt. Az AngularJS minden elnevezett űrlaphoz létrehoz egy űrlapvezérlőt, és ez a vezérlő teszi elérhetővé a beküldés kapuzásához szükséges jelzőket. novalidate így a böngésző kikapcsolva hagyja a saját HTML5 buborékait, és az AngularJS-t űrlap érvényesítése veszi át.

  1. Adja meg az űrlapot egy name. Az AngularJS közzétesz egy ilyen nevű vezérlőt a környező ellenőr hatálya.
  2. hozzáad novalidate az űrlapcímkéhez, így a natív böngésző-érvényesítés nem zavarja.
  3. Jelöld meg a mezőket a segítségével required, ng-minlength, ng-maxlength or ng-pattern.
  4. Védje a kutyakiképzőt $valid, és add át az űrlapvezérlőt, hogy a függvény ellenőrizni tudja az egyes mezőket.
  5. A gomb letiltása a következővel: ng-disabled mutatva $invalid, amely azonnali vizuális visszajelzést ad.
<form name="topicForm" ng-submit="topicForm.$valid && Display(topicForm)" novalidate>
    <input type="text" name="Topic" ng-model="Topic" required>
    <input type="submit" value="Submit" ng-disabled="topicForm.$invalid">
</form>

Két hiba okozza a legtöbb jelentett problémát ezzel a mintával kapcsolatban:

  • Double benyújtás. Kötelező ng-click a küldés gombra, miközben ng-submit A formon található parancs kétszer futtatja le a kezelőt, eseményenként egyszer. A hivatalos referencia óva int a két kezelő kombinálásától, ezért válassz egyet.
  • Váratlan beküldések. Bármely gomb egy űrlapon belül anélkül, hogy type="button" kiváltja a submit eseményt. Jelöld meg explicit módon a cancel és reset gombokat, különben azok is aktiválják a kezelőt.

Őrzés bekapcsolva $valid kényelmi, nem biztonsági ellenőrzés. Az értékeket továbbra is újra kell validálni a szerveren, mielőtt tárolásra kerülnének.

GYIK

Igen. Egy submit típusú bemenetet vagy gombot tartalmazó űrlap submit eseményt vált ki, amikor az Enter billentyűt lenyomjuk egy mezőn belül, így az ng-submit kifejezés további kulcskezelő nélkül fut.

Nem. Csak azok az űrlapelemek indítják el a submit eseményt, amelyekre a direktíva figyel. Helyezd át az ng-submit utasítást a form tagre, vagy csatold az ng-click utasítást ahhoz az elemhez, amelyre ténylegesen reagálni szeretnél.

Az ng-submit nem ad át argumentumokat. Olvassa be az ng-model által kitöltött hatókör-tulajdonságokat, vagy adja át azokat explicit módon, például ng-submit=”Display(Topic)” vagy ng-submit=”Display(topicForm)”.

Igen. Minden űrlapelem saját űrlapvezérlővel rendelkezik, ezért adjon minden űrlapnak egyedi nevet, és kössön hozzá külön kezelőt. Egy függvény megosztása űrlapok között hatókörütközésekhez vezet.

A kezelő mindkét irányba lő, de egy mezőt nem ng-modell soha nem írja ki az értékét a $scope-ba, így a függvény nem tudja azt olvasni. Minden feldolgozni kívánt bemenetet kötni kell.

Fordítsd le az űrlapot egy tesztben, állítsd be a modell értékét a hatókörön, indíts el egy submit eseményt, majd állítsd be az assert-et a kezelő által előállított tömbre vagy szolgáltatáshívásra. A Karma és a Jasmine továbbra is a szokásos párosítás.

A nyelvi modellek beolvassák a modell alakját és a szükséges vázlatot, az ng-pattern és ng-minlength attribútumokat, valamint a megfelelő üzeneteket, ami nagyban befolyásolja az AngularJS-t. űrlap érvényesítése dolgozzon be egy felülvizsgálati lépésbe.

GitHub másodpilóta Az ügynöki mód átírja a sablont az (ngSubmit) objektumba a FormGroup segítségével, és scaffolding módon kezeli a komponens osztályt, de a létrehozott validatorok és aszinkron hívások továbbra is emberi felülvizsgálatot és tesztelést igényelnek.

Foglald össze ezt a bejegyzést a következőképpen: