ng-submit στο AngularJS: Χειρισμός υποβολής φόρμας με παράδειγμα

⚡ Έξυπνη Σύνοψη

Η συνάρτηση ng-submit στο AngularJS συνδέει μια συνάρτηση ελεγκτή με το συμβάν υποβολής του προγράμματος περιήγησης μιας φόρμας, έτσι ώστε οι τιμές που εισάγονται να υποβάλλονται σε επεξεργασία μέσα στον ελεγκτή και η σελίδα να μην φορτώνει ποτέ ξανά μέσω ενός προεπιλεγμένου POST.

  • 🔘 Διευθυντικός ρόλος: Η συνάρτηση ng-submit συνδέει μια έκφραση AngularJS με το συμβάν υποβολής ενός στοιχείου φόρμας.
  • ☑️ Δεν υπάρχει επαναφόρτωση σελίδας: Το προεπιλεγμένο POST του προγράμματος περιήγησης καταστέλλεται, εκτός εάν η φόρμα φέρει ένα χαρακτηριστικό action.
  • Λειτουργικό παράδειγμα: Ένα πλαίσιο κειμένου συν την Display() ωθεί κάθε θέμα στον πίνακα AllTopic για ng-repeat.
  • 🧪 Πύλη επικύρωσης: Σύζευξη του $valid με τα μπλοκ novalidate και ng-disabled, υποβολή ελλιπών δεδομένων.
  • Συνηθισμένο λάθος: Το δέσιμο του ng-click στο κουμπί υποβολής δίπλα στο ng-submit προκαλεί διπλή υποβολή.
  • 📊 Σημείωση έκδοσης: Η υποστήριξη AngularJS έληξε τον Ιανουάριο του 2022. Η σύγχρονη Angular υποβάλλει μέσω (ngSubmit).

Η οδηγία ng-submit στο AngularJS συνδέει ένα συμβάν υποβολής φόρμας σε μια συνάρτηση ελεγκτή

Οδηγία AngularJS ng-submit

The ng-υποβολή οδηγία στο AngularJS χρησιμοποιείται για τη σύνδεση της εφαρμογής στο συμβάν υποβολής του προγράμματος περιήγησης. Έτσι στην περίπτωση του AngularJS στο συμβάν υποβολής, μπορείτε να πραγματοποιήσετε κάποια επεξεργασία στον ίδιο τον ελεγκτή και στη συνέχεια να εμφανίσετε τις επεξεργασμένες πληροφορίες στον χρήστη.

Σημείωση έκδοσης: Το AngularJS 1.x αποχώρησε από τη Μακροπρόθεσμη Υποστήριξη στις 31 Δεκεμβρίου 2021 και η ομάδα του framework επιβεβαιώνει ότι Η υποστήριξη του AngularJS έληξε επίσημα τον Ιανουάριο του 2022, επομένως δεν ακολουθούν εκδόσεις ή ενημερώσεις ασφαλείας. Κάθε βήμα και μπλοκ κώδικα παρακάτω διατηρείται ακριβώς όπως είναι γραμμένο, ως ιστορική αναφορά. Η νέα εργασία ανήκει στο σύγχρονο Angular, το οποίο εκφράζει την ίδια ιδέα με (ngSubmit) συνδεδεμένο με μια Ομάδα Φόρμας.

Πώς να υποβάλετε μια φόρμα στο AngularJS χρησιμοποιώντας το ng-submit

Οι διαδικασίες υποβολής πληροφοριών σε μια ιστοσελίδα συνήθως αντιμετωπίζονται από το συμβάν υποβολής στο πρόγραμμα περιήγησης Ιστού. Αυτό το συμβάν χρησιμοποιείται συνήθως για την αποστολή πληροφοριών που ο χρήστης ενδέχεται να έχει εισαγάγει σε μια ιστοσελίδα στον διακομιστή για περαιτέρω επεξεργασία, όπως διαπιστευτήρια σύνδεσης, δεδομένα φόρμας κ.λπ. Η υποβολή των πληροφοριών μπορεί να γίνει μέσω αιτήματος GET ή POST.

Ας πάρουμε ένα παράδειγμα υποβολής φόρμας Angular για να δούμε πώς μπορείτε να υποβάλετε φόρμες στο AngularJS.

Στο παράδειγμα υποβολής της φόρμας AngularJS, θα παρουσιάσουμε ένα πλαίσιο κειμένου στον χρήστη στο οποίο μπορεί να εισαγάγει το θέμα που θέλει να μάθει. Θα υπάρχει ένα κουμπί υποβολής στη σελίδα, το οποίο όταν πατηθεί θα προσθέσει το θέμα σε μια μη ταξινομημένη λίστα.

Η παρακάτω εικόνα tracπου ρέουν, από το θέμα που πληκτρολογείται στο πλαίσιο κειμένου, μέσω του κουμπιού "Υποβολή" και στο στοιχείο λίστας που προσαρτάται από κάτω.

Φόρμα AngularJS με πλαίσιο κειμένου θέματος, κουμπί Υποβολής και την προκύπτουσα μη ταξινομημένη λίστα θεμάτων
Υποβολή φόρμας στο AngularJS χρησιμοποιώντας το ng-submit

Παράδειγμα υποβολής φόρμας AngularJS

Τώρα, θα δούμε ένα παράδειγμα υποβολής φόρμας AngularJS από τον Ελεγκτή χρησιμοποιώντας την οδηγία ng-submit:

<!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 Επεξήγηση:

  1. Αρχικά δηλώνουμε την ετικέτα HTML της φόρμας μας, η οποία θα περιέχει τα στοιχεία ελέγχου "text box" και "submit button", όπως φαίνεται στο παράδειγμα συμβάντος υποβολής φόρμας Angular. Στη συνέχεια, χρησιμοποιούμε την οδηγία ng-submit AngularJS για να συνδέσουμε τη συνάρτηση "Display()" στη φόρμα μας. Αυτή η συνάρτηση θα οριστεί στον ελεγκτή μας και θα κληθεί κατά την υποβολή της φόρμας.
  2. Έχουμε ένα στοιχείο ελέγχου κειμένου στο οποίο ο χρήστης θα εισάγει το Θέμα που θέλει να μάθει. Αυτό θα δεσμευτεί σε μια μεταβλητή που ονομάζεται "Θέμα" που θα χρησιμοποιηθεί στον ελεγκτή μας.
  3. Υπάρχει το κανονικό κουμπί υποβολής στο AngularJS στο οποίο θα κάνει κλικ ο χρήστης όταν εισάγει το θέμα που θέλει.
  4. Χρησιμοποιήσαμε το ng-επανάληψη οδηγία για την εμφάνιση στοιχείων λίστας των θεμάτων που εισάγει ο χρήστης. Η οδηγία ng-repeat περνά από κάθε θέμα στον πίνακα "AllTopic" και εμφανίζει το όνομα του θέματος ανάλογα.
  5. Στον ελεγκτή μας, δηλώνουμε μια μεταβλητή πίνακα που ονομάζεται 'AllTopic'. Αυτή θα χρησιμοποιηθεί για να περιέχει όλα τα θέματα που εισήγαγε ο χρήστης στο Βήμα 2.
  6. Καθορίζουμε τον κώδικα για τη συνάρτηση Display() που θα καλείται κάθε φορά που ο χρήστης κάνει κλικ στο κουμπί Υποβολή. Εδώ χρησιμοποιούμε τη συνάρτηση πίνακα ώθησης για να προσθέσουμε τα Θέματα που εισάγει ο χρήστης μέσω της μεταβλητής 'Θέμα' στον πίνακα μας 'AllTopic'.

Εάν ο κώδικας του παραδείγματος φόρμας AngularJS εκτελεστεί με επιτυχία, θα εμφανιστεί η ακόλουθη Έξοδος όταν εκτελείτε τον κώδικά σας στο πρόγραμμα περιήγησης.
Παραγωγή:

Έξοδος προγράμματος περιήγησης του παραδείγματος ng-submit της AngularJS που εμφανίζει το κενό πλαίσιο κειμένου θέματος και το κουμπί Υποβολής

Για να δείτε τον κώδικα να λειτουργεί, πρώτα εισαγάγετε ένα όνομα θέματος όπως "Angular" όπως φαίνεται παραπάνω στο πλαίσιο κειμένου και, στη συνέχεια, κάντε κλικ στο κουμπί Υποβολή.

Έξοδος AngularJS ng-submit μετά το κλικ στην επιλογή Υποβολή, με το θέμα που εισαγάγατε να προστίθεται στη λίστα

  • Αφού κάνετε κλικ στο κουμπί υποβολής, θα δείτε το στοιχείο που εισήχθη στο πλαίσιο κειμένου προστέθηκε στη λίστα των στοιχείων.
  • Αυτό επιτυγχάνεται με τη συνάρτηση Display(), η οποία καλείται όταν πατηθεί το κουμπί υποβολής.
  • Η συνάρτηση Display() προσθέτει το κείμενο στη μεταβλητή του πίνακα που ονομάζεται "AllTopic". Και η οδηγία ng-repeat περνά από κάθε τιμή στη μεταβλητή του πίνακα 'AllTopic' και τις εμφανίζει ως στοιχεία λίστας ανάλογα.

ng-submit vs ng-click: Ποιο να χρησιμοποιήσετε

Και τα δύο Οδηγίες AngularJS μπορούν να καλέσουν την ίδια συνάρτηση ελεγκτή, ωστόσο ακούν διαφορετικά συμβάντα του προγράμματος περιήγησης. ng-submit κάθεται στο <form> και αντιδρά στο συμβάν υποβολής, επομένως ενεργοποιείται επίσης όταν ένας χρήστης πατήσει Enter μέσα σε ένα πεδίο. ng-click κάθεται σε ένα κουμπί και αντιδρά μόνο σε ένα κλικ του ποντικιού ή σε μια ισοδύναμη ενεργοποίηση.

Άποψη ng-υποβολή ng-κλικ
Στοιχείο κεντρικού υπολογιστή Η ετικέτα φόρμας Οποιοδήποτε στοιχείο με δυνατότητα κλικ
Ακούστηκε το συμβάν υποβολή, συμπεριλαμβανομένου του πλήκτρου Enter μόνο κλικ
Προεπιλεγμένο πρόγραμμα περιήγησης POST Καταστέλλεται από την οδηγία Εξακολουθεί να ενεργοποιείται από ένα κουμπί υποβολής
Πρόσβαση στην κατάσταση της φόρμας Διαβάζει τα $valid και $invalid στον ελεγκτή φόρμας Δεν υπάρχει δικό του μορφολογικό πλαίσιο
Φυσική εφαρμογή Παράδοση δεδομένων φόρμας σε έναν ελεγκτή Κουμπιά γραμμής εργαλείων, σύνδεσμοι, ενεργοποιητές τρόπου λειτουργίας

Η υποστήριξη πληκτρολογίου συνήθως καθορίζει την επιλογή. Μια φόρμα συνδεδεμένη με ng-click αγνοεί το πλήκτρο Enter, κάτι που αποθαρρύνει τους χρήστες που συμπληρώνουν ένα πλαίσιο σύνδεσης. Κράτηση ng-click για ενέργειες που δεν αποτελούν υποβολές φόρμας, όπως η εκκαθάριση ενός πεδίου ή το άνοιγμα ενός παραθύρου διαλόγου.

Γιατί το ng-submit αποτρέπει την προεπιλεγμένη υποβολή από το πρόγραμμα περιήγησης

Μια απλή φόρμα HTML αντιδρά σε ένα συμβάν υποβολής σειριοποιώντας τα πεδία της και ζητώντας από το πρόγραμμα περιήγησης να φορτώσει μια νέα σελίδα, η οποία απορρίπτει κάθε τιμή που διατηρείται στο $scope. ο ng-submit η οδηγία το εμποδίζει να συμβεί αυτό: καλεί preventDefault() για εσάς, έτσι ώστε η έκφραση να εκτελείται και η τρέχουσα σελίδα να παραμένει στη θέση της. Όχι $event απαιτείται όρισμα και δεν απαιτείται χειροκίνητη κλήση.

Η καταστολή έχει μία τεκμηριωμένη προϋπόθεση. Σύμφωνα με το Αναφορά ngSubmit, η προεπιλεγμένη ενέργεια αποτρέπεται μόνο όταν η φόρμα δεν φέρει action, data-action or x-action ιδιότητα. Προσθέστε οποιοδήποτε από αυτά και το πρόγραμμα περιήγησης θα πλοηγηθεί όπως συνήθως μετά την ολοκλήρωση του χειριστή, η οποία είναι η σωστή συμπεριφορά για μια προοδευτικά βελτιωμένη φόρμα που αποδίδεται από τον διακομιστή και αποτελεί έκπληξη παντού αλλού.

Επειδή η οδηγία καταπίνει το αντικείμενο συμβάντος, διαβάστε τις τιμές που υποβλήθηκαν από τις ιδιότητες που ng-μοντέλο έγραψαν στο πεδίο εφαρμογής ή τα πέρασαν ρητά, όπως στο ng-submit="Display(Topic)".

Πώς να επικυρώσετε μια φόρμα πριν από την εκτέλεση του ng-submit

Το παραπάνω παράδειγμα δέχεται ένα κενό θέμα, επειδή τίποτα δεν ελέγχει πρώτα το πλαίσιο κειμένου. Το AngularJS δημιουργεί έναν ελεγκτή φόρμας για κάθε ονομασμένη φόρμα και αυτός ο ελεγκτής εκθέτει τις σημαίες που απαιτούνται για την πύλη υποβολής. Προσθήκη novalidate έτσι ώστε το πρόγραμμα περιήγησης να αφήνει τις δικές του φυσαλίδες HTML5 απενεργοποιημένες και το AngularJS επικύρωση φόρμας αναλαμβάνει.

  1. Δώστε στη φόρμα ένα nameΤο AngularJS δημοσιεύει έναν ελεγκτή με αυτό το όνομα στον περιβάλλοντα χώρο. ελεγκτής πεδίο εφαρμογής.
  2. Πρόσθεση novalidate στην ετικέτα φόρμας, ώστε η εγγενής επικύρωση του προγράμματος περιήγησης να μην παρεμβαίνει.
  3. Σημειώστε τα πεδία χρησιμοποιώντας required, ng-minlength, ng-maxlength or ng-pattern.
  4. Φύλαξε τον χειριστή με $validκαι περάστε τον ελεγκτή φόρμας, ώστε η συνάρτηση να μπορεί να ελέγξει μεμονωμένα πεδία.
  5. Απενεργοποιήστε το κουμπί με ng-disabled δείχνοντας προς $invalid, το οποίο παρέχει άμεση οπτική ανατροφοδότηση.
<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>

Δύο λάθη ευθύνονται για τα περισσότερα αναφερόμενα προβλήματα με αυτό το μοτίβο:

  • Double υποβολή. Δεσμευτικός ng-click στο κουμπί υποβολής ενώ ng-submit κάθεται στη φόρμα και εκτελεί τον χειριστή δύο φορές, μία φορά ανά συμβάν. Η επίσημη αναφορά προειδοποιεί κατά του συνδυασμού των δύο χειριστών, οπότε επιλέξτε έναν.
  • Απροσδόκητες υποβολές. Οποιοδήποτε κουμπί μέσα σε μια φόρμα χωρίς type="button" εγείρει το συμβάν υποβολής. Επισημαίνει ρητά τα κουμπιά ακύρωσης και επαναφοράς, διαφορετικά ενεργοποιούν και τον χειριστή.

Φύλαξη σε λειτουργία $valid είναι μια διευκόλυνση, όχι ένας έλεγχος ασφαλείας. Οι τιμές πρέπει να επικυρωθούν εκ νέου στον διακομιστή πριν αποθηκευτούν.

Συχνές Ερωτήσεις

Ναι. Μια φόρμα που περιέχει μια είσοδο ή ένα κουμπί τύπου submit ενεργοποιεί το συμβάν submit όταν πατηθεί το Enter μέσα σε ένα πεδίο, επομένως η έκφραση ng-submit εκτελείται χωρίς κανένα επιπλέον χειριστή κλειδιών.

Όχι. Μόνο τα στοιχεία φόρμας ενεργοποιούν το συμβάν υποβολής για το οποίο ακούει η οδηγία. Μετακινήστε το ng-submit στην ετικέτα φόρμας ή επισυνάψτε το ng-click στο στοιχείο στο οποίο θέλετε πραγματικά να αντιδράσετε.

Η συνάρτηση ng-submit δεν μεταβιβάζει ορίσματα. Διαβάστε τις ιδιότητες εμβέλειας που συμπλήρωσε το ng-model ή μεταβιβάστε τες ρητά, για παράδειγμα ng-submit=”Display(Topic)” ή ng-submit=”Display(topicForm)”.

Ναι. Κάθε στοιχείο φόρμας έχει τον δικό του ελεγκτή φόρμας, επομένως δώστε σε κάθε φόρμα ένα μοναδικό όνομα και συνδέστε έναν ξεχωριστό χειριστή. Η κοινή χρήση μίας συνάρτησης σε όλες τις φόρμες προκαλεί συγκρούσεις εμβέλειας.

Ο χειριστής πυροδοτεί προς οποιαδήποτε κατεύθυνση, αλλά ένα πεδίο χωρίς ng-μοντέλο δεν γράφει ποτέ την τιμή του στο $scope, επομένως η συνάρτηση δεν μπορεί να τη διαβάσει. Δέστε κάθε είσοδο που σκοπεύετε να επεξεργαστείτε.

Μεταγλωττίστε τη φόρμα σε μια δοκιμή, ορίστε την τιμή του μοντέλου στο πεδίο εφαρμογής, ενεργοποιήστε ένα συμβάν υποβολής και, στη συνέχεια, κάντε επιβεβαίωση στον πίνακα ή την κλήση υπηρεσίας που παράγει ο χειριστής. Το Karma με το Jasmine παραμένει η συνήθης αντιστοίχιση.

Τα γλωσσικά μοντέλα διαβάζουν το απαιτούμενο σχήμα και σχέδιο του μοντέλου, τα χαρακτηριστικά ng-pattern και ng-minlength καθώς και τα αντίστοιχα μηνύματα, τα οποία μετατρέπουν πολύ το AngularJS. επικύρωση φόρμας εργασία σε ένα βήμα αναθεώρησης.

GitHub Copilot Η λειτουργία agent ξαναγράφει ένα πρότυπο στο (ngSubmit) με το FormGroup και ενσωματώνει την κλάση στοιχείων, ωστόσο οι δημιουργημένοι επικυρωτές και οι ασύγχρονες κλήσεις εξακολουθούν να χρειάζονται ανθρώπινη αναθεώρηση και δοκιμές.

Συνοψίστε αυτήν την ανάρτηση με: