ng-submit in AngularJS: Formulierverzending afhandelen met een voorbeeld

⚡ Slimme samenvatting

In AngularJS koppelt ng-submit een controllerfunctie aan de submit-gebeurtenis van een formulier in de browser. Hierdoor worden de ingevoerde waarden binnen de controller verwerkt en wordt de pagina nooit opnieuw geladen via een standaard POST-verzoek.

  • 🔘 Leidinggevende rol: ng-submit koppelt een AngularJS-expressie aan de submit-gebeurtenis van een formulierelement.
  • ☑️ Geen paginaverversing: De standaard POST-request van de browser wordt onderdrukt, tenzij het formulier een actie-attribuut bevat.
  • Uitgewerkt voorbeeld: Een tekstvak in combinatie met Display() voegt elk onderwerp toe aan de AllTopic-array voor ng-repeat.
  • 🧪 Validatiepoort: Door $valid te combineren met novalidate en ng-disabled wordt het verzenden van onvolledige gegevens geblokkeerd.
  • Veel voorkomende fout: Het koppelen van ng-click aan de verzendknop naast ng-submit veroorzaakt een dubbele verzending.
  • 📊 Versie-opmerking: De ondersteuning voor AngularJS is in januari 2022 beëindigd; moderne Angular-applicaties verzenden hun werk via (ngSubmit).

De ng-submit-richtlijn in AngularJS koppelt een formulierverzending aan een controllerfunctie.

AngularJS ng-submit-richtlijn

De ng-verzenden richtlijn in AngularJS wordt gebruikt om de applicatie te binden aan de submission-gebeurtenis van de browser. Dus in het geval van angularjs tijdens de submission-gebeurtenis kunt u een bepaalde verwerking binnen de controller zelf uitvoeren en vervolgens de verwerkte informatie aan de gebruiker weergeven.

Versie-opmerking: AngularJS 1.x heeft op 31 december 2021 de Long Term Support-status verlaten, en het frameworkteam bevestigt dat De ondersteuning voor AngularJS is officieel beëindigd. in januari 2022, dus er volgen geen releases of beveiligingspatches. Elke stap en elk codeblok hieronder is exact zoals geschreven, als historische referentie. Nieuw werk hoort thuis in het moderne Angular, dat hetzelfde idee uitdrukt als (ngSubmit) gekoppeld aan een FormGroup.

Een formulier indienen in AngularJS met ng-submit

De processen voor het indienen van informatie op een webpagina worden normaal gesproken afgehandeld door de indieningsgebeurtenis in de webbrowser. Deze gebeurtenis wordt normaal gesproken gebruikt om informatie die de gebruiker mogelijk op een webpagina heeft ingevoerd naar de server te sturen voor verdere verwerking, zoals inloggegevens, formuliergegevens, enz. Het indienen van informatie kan worden gedaan via een GET- of POST-verzoek.

Laten we een voorbeeld van het indienen van een Angular-formulier nemen om te zien hoe u formulieren kunt indienen in AngularJS.

In ons AngularJS form submit voorbeeld, gaan we een tekstvak aan de gebruiker presenteren waarin ze het onderwerp kunnen invoeren dat ze willen leren. Er zal een submit knop op de pagina zijn, die wanneer ingedrukt het onderwerp zal toevoegen aan een ongeordende lijst.

De onderstaande afbeelding traces die stromen, van het onderwerp dat in het tekstvak is getypt, via de knop 'Verzenden', naar het lijstitem dat eronder is toegevoegd.

AngularJS-formulier met een tekstvak voor een onderwerp, een verzendknop en de resulterende ongeordende lijst met onderwerpen.
Een formulier indienen in AngularJS met ng-submit

Voorbeeld van AngularJS-formulier indienen

Nu zullen we een voorbeeld zien van het indienen van een AngularJS-formulier door Controller met behulp van de ng-submit-richtlijn:

<!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 Uitleg:

  1. We definiëren eerst de HTML-tag van ons formulier, die de besturingselementen voor het tekstvak en de verzendknop zal bevatten, zoals weergegeven in het voorbeeld van de Angular-formulierverzending. Vervolgens gebruiken we de AngularJS-richtlijn `ng-submit` om de functie `Display()` aan ons formulier te koppelen. Deze functie wordt gedefinieerd in onze controller en wordt aangeroepen wanneer het formulier wordt verzonden.
  2. We hebben een tekstbesturingselement waarin de gebruiker het onderwerp invoert dat hij of zij wil leren. Dit zal gebonden zijn aan een variabele genaamd 'Topic' die in onze controller zal worden gebruikt.
  3. Er is de normale verzendknop in AngularJS waarop de gebruiker klikt wanneer hij het gewenste onderwerp heeft ingevoerd.
  4. We hebben de ng-herhalen instructie om lijstitems weer te geven van de onderwerpen die de gebruiker invoert. De ng-repeat-richtlijn doorloopt elk onderwerp in de array 'AllTopic' en geeft de onderwerpnaam dienovereenkomstig weer.
  5. In onze controller declareren we een arrayvariabele genaamd 'AllTopic'. Deze wordt gebruikt om alle onderwerpen op te slaan die de gebruiker in stap 2 heeft ingevoerd.
  6. We definiëren de code voor onze Display()-functie die wordt aangeroepen wanneer de gebruiker op de knop Verzenden klikt. Hier gebruiken we de push array-functie om de onderwerpen die door de gebruiker zijn ingevoerd via de variabele 'Topic' toe te voegen aan onze array 'AllTopic'.

Als de AngularJS-formuliervoorbeeldcode succesvol is uitgevoerd, wordt de volgende uitvoer weergegeven wanneer u uw code in de browser uitvoert.
Output:

Browseruitvoer van het AngularJS ng-submit-voorbeeld met het lege onderwerptekstvak en de verzendknop.

Om de code werkend te zien, voer je eerst een onderwerpnaam in, zoals 'Angular' zoals hierboven weergegeven in het tekstvak, en klik je vervolgens op de knop Verzenden.

De uitvoer van AngularJS ng-submit na het klikken op 'Verzenden', waarbij het ingevoerde onderwerp aan de lijst is toegevoegd.

  • Nadat u op de knop Verzenden hebt geklikt, wordt het item dat u in het tekstvak hebt ingevoerd, toegevoegd aan de lijst met items.
  • Dit wordt bereikt door de functie Display(), die wordt aangeroepen wanneer op de knop Verzenden wordt gedrukt.
  • De functie Display() voegt de tekst toe aan de arrayvariabele genaamd 'AllTopic'. En onze ng-repeat-richtlijn doorloopt elke waarde in de arrayvariabele 'AllTopic' en geeft ze dienovereenkomstig weer als lijstitems.

ng-submit versus ng-click: welke te gebruiken

Beiden AngularJS-richtlijnen Ze kunnen dezelfde controllerfunctie aanroepen, maar luisteren naar verschillende browsergebeurtenissen. ng-submit zit op de <form> De tag reageert op de submit-gebeurtenis, dus deze wordt ook geactiveerd wanneer een gebruiker op Enter drukt in een veld. ng-click Het apparaat zit op een knop en reageert alleen op een muisklik of een gelijkwaardige activering.

Aspect ng-verzenden ng-klik
Gastelement De formuliertag Elk klikbaar element
Evenement beluisterd verzenden, inclusief de Enter-toets klik alleen
Standaard browser POST Onderdrukt door de richtlijn Het blijft vuur geven vanuit een verzendknop.
Toegang tot formulierstatus Leest de waarden $valid en $invalid in de formuliercontroller. Geen eigen vormcontext
natuurlijke pasvorm Formuliergegevens doorgeven aan een controller Knoppen, links en modale triggers in de werkbalk

Toetsenbordondersteuning geeft meestal de doorslag. Een bedraad formulier met ng-click Het programma negeert de Enter-toets, wat frustrerend is voor gebruikers die een inlogformulier moeten invullen. ng-click voor acties die geen formulierinzendingen zijn, zoals het wissen van een veld of het openen van een dialoogvenster.

Waarom ng-submit voorkomt dat de standaard browser de submit-functie gebruikt

Een eenvoudig HTML-formulier reageert op een verzendgebeurtenis door de velden te serialiseren en de browser te vragen een nieuwe pagina te laden, waarbij alle opgeslagen waarden worden verwijderd. $scope. De ng-submit De richtlijn voorkomt dat dit gebeurt: ze roept aan preventDefault() voor jou, zodat de expressie wordt uitgevoerd en de huidige pagina blijft. Nee $event Argumenten zijn niet nodig en er is geen handmatige aanroep vereist.

De onderdrukking kent één gedocumenteerde voorwaarde. Volgens de ngSubmit-referentieDe standaardactie wordt alleen voorkomen zolang het formulier geen inhoud bevat. action, data-action or x-action attribuut. Voeg een van deze toe en de browser navigeert zoals gebruikelijk nadat de handler klaar is, wat het juiste gedrag is voor een server-rendered formulier met progressieve verbetering en een verrassing in alle andere gevallen.

Omdat de instructie het gebeurtenisobject negeert, lees je de ingediende waarden uit de eigenschappen die ng-model schrijf ze naar de scope, of geef ze expliciet door, zoals in ng-submit="Display(Topic)".

Hoe valideer je een formulier voordat ng-submit wordt uitgevoerd?

Het bovenstaande voorbeeld accepteert een leeg onderwerp, omdat er eerst niets in het tekstvak wordt gecontroleerd. AngularJS bouwt een formuliercontroller voor elk benoemd formulier, en die controller geeft de benodigde vlaggen weer om de indiening te controleren. novalidate De browser laat dus zijn eigen HTML5-bubbels uitgeschakeld en AngularJS formulier validatie neemt het over.

  1. Geef het formulier een nameAngularJS publiceert een controller met die naam op de omringende componenten. controleur reikwijdte.
  2. Toevoegen novalidate naar de formulier-tag, zodat de native browservalidatie niet in de weg zit.
  3. Markeer de velden met behulp van required, ng-minlength, ng-maxlength or ng-pattern.
  4. Bescherm de begeleider met $validen geef de formuliercontroller door, zodat de functie de afzonderlijke velden kan inspecteren.
  5. Schakel de knop uit met ng-disabled wijzend naar $invalid, wat onmiddellijke visuele feedback geeft.
<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>

Twee fouten zijn verantwoordelijk voor de meeste gemelde problemen met dit patroon:

  • Double voorlegging. Bindend ng-click op de verzendknop terwijl ng-submit Het formulier voert de handler twee keer uit, één keer per gebeurtenis. De officiële documentatie waarschuwt tegen het combineren van de twee handlers, dus kies er één.
  • Onverwachte inzendingen. Elke knop binnen een formulier zonder type="button" Roept de submit-gebeurtenis op. Markeer de annuleer- en resetknoppen expliciet, anders activeren ze ook de handler.

Bewaking op $valid Het is een handigheidje, geen beveiligingsmaatregel. Waarden moeten nog steeds op de server worden gevalideerd voordat ze worden opgeslagen.

Veelgestelde vragen

Ja. Een formulier met een invoerveld of knop van het type 'submit' activeert de 'submit'-gebeurtenis wanneer de Enter-toets in een veld wordt ingedrukt, waardoor de ng-submit-expressie zonder extra toetsafhandeling wordt uitgevoerd.

Nee. Alleen formulierelementen genereren de submit-gebeurtenis waar de directive naar luistert. Plaats `ng-submit` in de `form`-tag of koppel `ng-click` aan het element waarop je daadwerkelijk wilt reageren.

ng-submit geeft geen argumenten door. Lees de scope-eigenschappen die ng-model heeft ingevuld, of geef ze expliciet door, bijvoorbeeld ng-submit=”Display(Topic)” of ng-submit=”Display(topicForm)”.

Ja. Elk formulierelement krijgt zijn eigen formuliercontroller, dus geef elk formulier een unieke naam en koppel er een aparte handler aan. Het delen van één functie over meerdere formulieren kan leiden tot conflicten in de scope.

De handler wordt in beide gevallen geactiveerd, maar een veld zonder ng-model De waarde wordt nooit naar $scope geschreven, waardoor de functie deze niet kan lezen. Bind elke invoer die je wilt verwerken.

Compileer het formulier in een test, stel de modelwaarde in op de scope, activeer een submit-gebeurtenis en controleer vervolgens de array of serviceaanroep die de handler produceert. Karma met Jasmine blijft de gebruikelijke combinatie.

Taalmodellen lezen de modelstructuur en de vereiste concepten, de attributen ng-pattern en ng-minlength, plus de bijbehorende berichten, wat veel AngularJS-functionaliteit oplevert. formulier validatie werk dit uit in een evaluatiestap.

GitHub-copiloot In de agentmodus wordt een template herschreven naar (ngSubmit) met FormGroup en wordt de componentklasse gegenereerd, maar de gegenereerde validators en asynchrone aanroepen moeten nog steeds handmatig worden gecontroleerd en getest.

Vat dit bericht samen met: