ng-submit w AngularJS: obsługa przesyłania formularzy z przykładem

⚡ Inteligentne podsumowanie

ng-submit w AngularJS wiąże funkcję kontrolera ze zdarzeniem przesyłania formularza w przeglądarce, dzięki czemu wprowadzone wartości są przetwarzane wewnątrz kontrolera, a strona nigdy nie jest przeładowywana przez domyślne żądanie POST.

  • 🔘 Rola dyrektywna: ng-submit wiąże wyrażenie AngularJS ze zdarzeniem Submit elementu formularza.
  • Brak przeładowania strony: Domyślna przeglądarka POST pomija żądanie, chyba że formularz zawiera atrybut akcji.
  • Przykład rozwiązania: Pole tekstowe i funkcja Display() umieszczają każdy temat w tablicy AllTopic w celu powtórzenia polecenia ng-repeat.
  • 🧪 Bramka walidacyjna: Sparowanie $valid z novalidate i ng-disabled blokuje przesyłanie niekompletnych danych.
  • 🛠️. Częsty błąd: Powiązanie polecenia ng-click z przyciskiem Submit obok polecenia ng-submit powoduje podwójne przesłanie.
  • 📊 Uwaga dotycząca wersji: Wsparcie dla AngularJS zakończyło się w styczniu 2022 r.; nowoczesne przesyłanie Angular odbywa się za pośrednictwem (ngSubmit).

Dyrektywa ng-submit w AngularJS wiążąca zdarzenie przesłania formularza z funkcją kontrolera

Dyrektywa AngularJS dotycząca przesyłania

ng-prześlij dyrektywa w AngularJS służy do powiązania aplikacji ze zdarzeniem przesyłania przeglądarki. Zatem w przypadku angularjs w zdarzeniu przesyłania możesz przeprowadzić pewne przetwarzanie w samym kontrolerze, a następnie wyświetlić przetworzone informacje użytkownikowi.

Uwaga dotycząca wersji: AngularJS 1.x zakończył długoterminowe wsparcie 31 grudnia 2021 r., a zespół ds. frameworka potwierdza, że Wsparcie AngularJS oficjalnie zakończone w styczniu 2022 roku, więc nie pojawią się żadne wydania ani poprawki bezpieczeństwa. Każdy krok i blok kodu poniżej jest dokładnie taki, jaki został napisany, zgodnie z historycznym odniesieniem. Nowe prace należą do nowoczesnego Angulara, który wyraża tę samą ideę. (ngSubmit) powiązany z FormGroup.

Jak przesłać formularz w AngularJS za pomocą ng-submit

Procesy przesyłania informacji na stronie internetowej są zwykle obsługiwane przez zdarzenie przesyłania w przeglądarce internetowej. To zdarzenie jest zwykle używane do wysyłania informacji, które użytkownik mógł wprowadzić na stronie internetowej, do serwera w celu dalszego przetwarzania, takich jak dane logowania, dane formularzy itp. Przesyłanie informacji może odbywać się za pomocą żądania GET lub POST.

Weźmy przykład przesyłania formularza Angular, aby zobaczyć, jak przesyłać formularze w AngularJS.

W naszym przykładzie AngularJS form submit pokażemy użytkownikowi pole tekstowe, w którym może wpisać temat, którego chce się nauczyć. Na stronie będzie przycisk Submit, który po naciśnięciu doda temat do nieuporządkowanej listy.

Ilustracja poniżej tracktóre przepływają od tematu wpisanego w polu tekstowym, poprzez przycisk Prześlij, do elementu listy dołączonego poniżej.

Formularz AngularJS z polem tekstowym tematu, przyciskiem Wyślij i powstałą nieuporządkowaną listą tematów
Przesyłanie formularza w AngularJS za pomocą ng-submit

Przykład przesłania formularza AngularJS

Teraz zobaczymy przykład przesyłania formularza AngularJS z kontrolera przy użyciu dyrektywy 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 Wyjaśnienie:

  1. Najpierw deklarujemy nasz znacznik HTML formularza, który będzie zawierał kontrolkę „pole tekstowe” i „przycisk przesyłania”, jak pokazano w przykładzie zdarzenia przesyłania formularza Angular. Następnie używamy dyrektywy AngularJS ng-submit, aby powiązać funkcję „Display()” z naszym formularzem. Funkcja ta zostanie zdefiniowana w naszym kontrolerze i zostanie wywołana po przesłaniu formularza.
  2. Mamy kontrolkę tekstową, w której użytkownik wpisuje Temat, którego chce się uczyć. Będzie to powiązane ze zmienną o nazwie „Temat”, która będzie używana w naszym kontrolerze.
  3. W AngularJS znajduje się normalny przycisk przesyłania, który użytkownik kliknie po wprowadzeniu żądanego tematu.
  4. Korzystaliśmy z ng-powtórz dyrektywa wyświetlająca elementy listy tematów wprowadzonych przez użytkownika. Dyrektywa ng-repeat przegląda każdy temat w tablicy „AllTopic” i odpowiednio wyświetla nazwę tematu.
  5. W naszym kontrolerze deklarujemy zmienną tablicową o nazwie „AllTopic”. Będzie ona używana do przechowywania wszystkich tematów wprowadzonych przez użytkownika w kroku 2.
  6. Definiujemy kod naszej funkcji Display(), która będzie wywoływana za każdym razem, gdy użytkownik kliknie przycisk Wyślij. Tutaj używamy funkcji tablicy push, aby dodać tematy wprowadzone przez użytkownika za pomocą zmiennej „Temat” do naszej tablicy „AllTopic”.

Jeśli przykładowy kod formularza AngularJS zostanie wykonany pomyślnie, po uruchomieniu kodu w przeglądarce zostanie wyświetlony następujący wynik.
Wyjście:

Wyjście przeglądarki przykładu AngularJS ng-submit pokazujące puste pole tekstowe tematu i przycisk Prześlij

Aby zobaczyć działający kod, najpierw wpisz nazwę tematu, np. „Angular”, jak pokazano powyżej, w polu tekstowym, a następnie kliknij przycisk Prześlij.

Wyjście AngularJS ng-submit po kliknięciu Prześlij, z wprowadzonym tematem dodanym do listy

  • Po kliknięciu przycisku „Prześlij” zobaczysz, że element wpisany w polu tekstowym został dodany do listy elementów.
  • Osiąga się to za pomocą funkcji Display(), która jest wywoływana po naciśnięciu przycisku wysyłania.
  • Funkcja Display() dodaje tekst do zmiennej tablicowej o nazwie „AllTopic”. Nasza dyrektywa ng-repeat przegląda każdą wartość zmiennej tablicowej „AllTopic” i odpowiednio wyświetla ją jako elementy listy.

ng-submit vs ng-click: którego użyć

Obie Dyrektywy AngularJS mogą wywołać tę samą funkcję kontrolera, ale nasłuchują różnych zdarzeń przeglądarki. ng-submit siedzi na <form> i reaguje na zdarzenie Submit, więc jest on wyzwalany również wtedy, gdy użytkownik naciśnie Enter w polu. ng-click umieszczany jest na przycisku i reaguje wyłącznie na kliknięcie myszką lub podobną aktywację.

WYGLĄD ng-prześlij kliknij
Element hosta Tag formularza Dowolny klikalny element
Wydarzenie odsłuchane prześlij, w tym klawisz Enter tylko kliknij
Domyślna przeglądarka POST Wykluczone przez dyrektywę Nadal działa po kliknięciu przycisku „Wyślij”
Dostęp do stanu formularza Odczytuje $valid i $invalid w kontrolerze formularza Brak własnego kontekstu formularza
Naturalne dopasowanie Przekazywanie danych formularza do kontrolera Przyciski paska narzędzi, linki, wyzwalacze modalne

Obsługa klawiatury zazwyczaj rozstrzyga wybór. Formularz z okablowaniem ng-click samo w sobie ignoruje klawisz Enter, który frustruje użytkowników wypełniających pole logowania. ng-click do działań, które nie są wysyłaniem formularzy, np. wyczyszczenie pola lub otwarcie okna dialogowego.

Dlaczego ng-submit uniemożliwia przesłanie domyślnej przeglądarki

Zwykły formularz HTML reaguje na zdarzenie wysłania, serializując swoje pola i prosząc przeglądarkę o załadowanie nowej strony, która usuwa wszystkie przechowywane w niej wartości. $scope, ng-submit dyrektywa zapobiega temu, wzywając preventDefault() dla Ciebie, więc wyrażenie działa, a bieżąca strona pozostaje na swoim miejscu. Nie $event nie jest wymagany żaden argument ani ręczne wywołanie.

Tłumienie ma jeden udokumentowany warunek. Zgodnie z ngPrześlij odniesieniedomyślna akcja jest zapobiegana tylko wtedy, gdy formularz nie zawiera żadnych danych action, data-action or x-action Atrybut. Dodaj dowolny z nich, a przeglądarka po zakończeniu obsługi przejdzie do normalnej nawigacji, co jest prawidłowym zachowaniem dla formularza renderowanego stopniowo przez serwer i niespodzianką wszędzie indziej.

Ponieważ dyrektywa pochłania obiekt zdarzenia, odczytaj przesłane wartości z właściwości, które model ng zapisał w zakresie lub przekazał je jawnie, jak w ng-submit="Display(Topic)".

Jak sprawdzić poprawność formularza przed uruchomieniem ng-submit

Powyższy przykład akceptuje pusty temat, ponieważ nic nie sprawdza najpierw pola tekstowego. AngularJS tworzy kontroler formularza dla każdego nazwanego formularza, a ten kontroler udostępnia flagi potrzebne do zablokowania przesłania. Dodaj novalidate więc przeglądarka pozostawia wyłączone własne bąbelki HTML5 i AngularJS walidacja formularza przejmuje.

  1. Podaj formularz name. AngularJS publikuje kontroler o tej nazwie w otaczającym go kontroler Zakres.
  2. Dodaj novalidate do znacznika formularza, dzięki czemu natywna walidacja przeglądarki nie będzie przeszkadzać.
  3. Zaznacz pola, używając required, ng-minlength, ng-maxlength or ng-pattern.
  4. Strzeż przewodnika za pomocą $validi przekaż kontroler formularza, aby funkcja mogła sprawdzić poszczególne pola.
  5. Wyłącz przycisk za pomocą ng-disabled wskazując na $invalid, co zapewnia natychmiastową informację zwrotną wizualną.
<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>

Dwa błędy odpowiadają za większość zgłaszanych problemów z tym wzorcem:

  • Double uległość. Wiążący ng-click na przycisku „Wyślij”, podczas gdy ng-submit W przypadku, gdy obiekt znajduje się w formularzu, handler jest uruchamiany dwukrotnie, raz na zdarzenie. Oficjalne źródło ostrzega przed łączeniem obu handlerów, więc wybierz jeden.
  • Nieoczekiwane zgłoszenia. Dowolny przycisk wewnątrz formularza bez type="button" Wywołuje zdarzenie Submit. Zaznacz jawnie przyciski Cancel i Reset, w przeciwnym razie one również wyzwolą procedurę obsługi.

Pilnowanie $valid To wygoda, a nie kontrola bezpieczeństwa. Wartości nadal muszą zostać ponownie zweryfikowane na serwerze przed zapisaniem.

FAQ

Tak. Formularz zawierający pole wprowadzania danych lub przycisk typu Submit wywołuje zdarzenie Submit, gdy w polu zostanie naciśnięty klawisz Enter, więc wyrażenie ng-submit działa bez żadnego dodatkowego klucza.

Nie. Tylko elementy formularza generują zdarzenie Submit, na które nasłuchuje dyrektywa. Przenieś ng-submit na znacznik formularza lub dołącz ng-click do elementu, na który chcesz zareagować.

ng-submit nie przekazuje żadnych argumentów. Odczytaj właściwości zakresu, które wypełnił ng-model, lub przekaż je jawnie, na przykład ng-submit=”Display(Topic)” lub ng-submit=”Display(topicForm)”.

Tak. Każdy element formularza ma swój własny kontroler, więc nadaj każdemu formularzowi unikalną nazwę i powiąż go z osobnym handlerem. Współdzielenie jednej funkcji w różnych formularzach prowadzi do kolizji zakresów.

Obsługujący strzela w obie strony, ale pole bez model ng Nigdy nie zapisuje swojej wartości do $scope, więc funkcja nie może jej odczytać. Powiąż wszystkie dane wejściowe, które planujesz przetworzyć.

Kompiluj formularz w teście, ustaw wartość modelu w zakresie, wyzwól zdarzenie Submit, a następnie wykonaj assert na tablicy lub wywołaniu usługi wygenerowanym przez moduł obsługi. Karma z Jasmine pozostaje standardowym połączeniem.

Modele językowe odczytują wymagany kształt modelu i szkic, atrybuty ng-pattern i ng-minlength oraz dopasowane wiadomości, co znacznie zmienia AngularJS walidacja formularza przejść do etapu przeglądu.

Drugi pilot GitHub Tryb agenta przepisuje szablon do (ngSubmit) z FormGroup i tworzy szkielet klasy komponentu, ale wygenerowane walidatory i wywołania asynchroniczne nadal wymagają przeglądu i testów przez człowieka.

Podsumuj ten post następująco: