ng-submit i AngularJS: Håndter skjemainnsending med eksempel
⚡ Smart oppsummering
ng-submit i AngularJS binder en kontrollerfunksjon til nettleserens submit-hendelse i et skjema, slik at inntastede verdier behandles inne i kontrolleren og siden aldri lastes inn på nytt via en standard POST.
AngularJS ng-send-direktiv
Ocuco ng-send inn direktiv i AngularJS brukes til å binde applikasjonen til innsendingshendelsen til nettleseren. Så i tilfelle av AngularJS på innsendingshendelsen kan du utføre en del behandling i selve kontrolløren og deretter vise den behandlede informasjonen til brukeren.
Versjonsmerknad: AngularJS 1.x forlot langtidsstøtten 31. desember 2021, og rammeverksteamet bekrefter det. AngularJS-støtten er offisielt avsluttet i januar 2022, så ingen utgivelser eller sikkerhetsoppdateringer følger. Hvert trinn og kodeblokk nedenfor beholdes nøyaktig som skrevet, som den historiske referansen. Nytt arbeid hører hjemme i moderne Angular, som uttrykker den samme ideen som (ngSubmit) bundet til en FormGroup.
Hvordan sende inn et skjema i AngularJS ved å bruke ng-submit
Prosessene for å sende inn informasjon på en nettside håndteres normalt av innsendingshendelsen i nettleseren. Denne hendelsen brukes vanligvis til å sende informasjon som brukeren kan ha skrevet inn på en nettside til serveren for videre behandling som påloggingsinformasjon, skjemadata osv. Innsending av informasjon kan gjøres gjennom GET eller POST-forespørsel.
La oss ta et eksempel på et Angular-skjema for å se hvordan du sender inn skjemaer i AngularJS.
I vårt AngularJS-innsendingseksempel skal vi presentere en tekstboks for brukeren der de kan skrive inn emnet de vil lære. Det vil være en send-knapp på siden, som når den trykkes vil legge emnet til en uordnet liste.
Illustrasjonen nedenfor tracsom flyter, fra emnet som er skrevet inn i tekstboksen, via Send-knappen, til listeelementet som er lagt til under.

Eksempel på innsending av AngularJS-skjema
Nå vil vi se et eksempel på innsending av AngularJS-skjema fra kontrollør som bruker ng-submit-direktivet:
<!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()">
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 Forklaring:
- Først deklarerer vi HTML-taggen for skjemaet vårt, som vil inneholde kontrollene «tekstboks» og «send-knapp», som vist i eksemplet på Angulars form submit-hendelse. Deretter bruker vi ng-submit AngularJS-direktivet for å binde funksjonen «Display()» til skjemaet vårt. Denne funksjonen vil bli definert i kontrolleren vår og vil bli kalt når skjemaet sendes inn.
- Vi har en tekstkontroll der brukeren skal skrive inn emnet de ønsker å lære. Dette vil være bundet til en variabel kalt 'Tema' som vil bli brukt i kontrolleren vår.
- Det er den vanlige send-knappen i AngularJS som brukeren vil klikke når de har skrevet inn emnet de ønsker.
- Vi har brukt ng-gjenta direktiv for å vise listeelementer over emnene brukeren skriver inn. ng-repeat-direktivet går gjennom hvert emne i arrayen 'AllTopic' og viser emnenavnet tilsvarende.
- I kontrolleren vår deklarerer vi en arrayvariabel kalt «AllTopic». Denne vil bli brukt til å inneholde alle emnene som ble angitt av brukeren i trinn 2.
- Vi definerer koden for Display()-funksjonen vår som kalles opp hver gang brukeren klikker på Send-knappen. Her bruker vi push-array-funksjonen for å legge til emnene som er lagt inn av brukeren via variabelen 'Emne' i vår matrise 'AllTopic'.
Hvis eksempelkoden for AngularJS-formen er utført vellykket, vil følgende utdata vises når du kjører koden i nettleseren.
Utgang:
For å se at koden fungerer, skriv først inn et emnenavn som "Angular" som vist ovenfor i tekstboksen og klikk deretter på Send-knappen.
- Etter at du har klikket på send-knappen, vil du se elementet som ble lagt inn i tekstboksen lagt til i listen over elementer.
- Dette oppnås av Display()-funksjonen, som kalles opp når send-knappen trykkes.
- Display()-funksjonen legger til teksten til matrisevariabelen kalt 'AllTopic'. Og vårt ng-repeat-direktiv går gjennom hver verdi i matrisevariabelen 'AllTopic' og viser dem som listeelementer tilsvarende.
ng-send vs ng-klikk: Hvilken du skal bruke
Begge AngularJS-direktiver kan kalle den samme kontrollerfunksjonen, men de lytter til forskjellige nettleserhendelser. ng-submit sitter på <form> taggen og reagerer på submit-hendelsen, slik at den også utløses når en bruker trykker Enter i et felt. ng-click sitter på en knapp og reagerer bare på et museklikk eller en tilsvarende aktivering.
| Aspekt | ng-send inn | ng-klikk |
|---|---|---|
| Vertselement | Skjema-taggen | Ethvert klikkbart element |
| Hendelsen ble lyttet til | send inn, inkludert Enter-tasten | bare klikk |
| Standard nettleser POST | Undertrykt av direktivet | Utløses fortsatt fra en send-knapp |
| Tilgang til skjemastatus | Leser $valid og $invalid på skjemakontrolleren | Ingen egen formkontekst |
| Naturlig passform | Overføring av skjemadata til en kontrollør | Verktøylinjeknapper, lenker, modale utløsere |
Tastaturstøtte avgjør vanligvis valget. Et skjema koblet til ng-click alene ignorerer Enter-tasten, noe som frustrerer brukere som fyller ut en påloggingsboks. Reserver ng-click for handlinger som ikke er skjemainnsendinger, for eksempel å tømme et felt eller åpne en dialogboks.
Hvorfor ng-submit forhindrer standard nettleserinnsending
Et vanlig HTML-skjema reagerer på en «send»-hendelse ved å serialisere feltene og be nettleseren om å laste inn en ny side, som forkaster alle verdier som finnes i $scope. De ng-submit Direktivet hindrer at det skjer: det kaller preventDefault() for deg, slik at uttrykket kjører og gjeldende side forblir på plass. Nei $event argument og ingen manuell kalling er nødvendig.
Undertrykkelsen har én dokumentert tilstand. I følge ngSend inn referanse, standardhandlingen forhindres bare når skjemaet ikke inneholder noe action, data-action or x-action attributt. Legg til hvilken som helst av disse, og nettleseren navigerer som vanlig etter at behandleren er ferdig, noe som er riktig oppførsel for et gradvis forbedret server-gjengitt skjema og en overraskelse overalt ellers.
Fordi direktivet sluker hendelsesobjektet, les innsendte verdier fra egenskapene som ng-modell skrev på omfanget, eller sendte dem eksplisitt, som i ng-submit="Display(Topic)".
Slik validerer du et skjema før ng-submit kjøres
Eksemplet ovenfor godtar et tomt emne, fordi ingenting sjekker tekstboksen først. AngularJS bygger en skjemakontroller for hvert navngitte skjema, og den kontrolleren eksponerer flaggene som trengs for å portere innsending. novalidate så nettleseren lar sine egne HTML5-bobler være avslått og AngularJS formvalidering tar over.
- Gi skjemaet en
nameAngularJS publiserer en kontroller med det navnet på det omkringliggende controller omfang. - Legg til
novalidatetil skjemataggen slik at validering av den innebygde nettleseren ikke er i veien. - Merk feltene ved hjelp av
required,ng-minlength,ng-maxlengthorng-pattern. - Beskytt føreren med
$valid, og send inn skjemakontrolleren slik at funksjonen kan inspisere individuelle felt. - Deaktiver knappen med
ng-disabledpeker på$invalid, som gir umiddelbar visuell tilbakemelding.
<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>
To feil står for de fleste rapporterte problemene med dette mønsteret:
- Double innlevering. Bindende
ng-clickpå send-knappen mensng-submitsitter på skjemaet kjører behandleren to ganger, én gang per hendelse. Den offisielle referansen advarer mot å kombinere de to behandlerne, så velg én. - Uventede innsendinger. Enhver knapp i et skjema uten
type="button"hever send-hendelsen. Marker avbryt- og tilbakestillingsknappene eksplisitt, ellers utløser de også behandleren.
Vakt på $valid er en bekvemmelighet, ikke en sikkerhetskontroll. Verdier må fortsatt valideres på nytt på serveren før de lagres.


