ng-submit в AngularJS: пример обработки отправки формы
⚡ Умное резюме
В AngularJS ng-submit привязывает функцию контроллера к событию отправки формы в браузере, поэтому введенные значения обрабатываются внутри контроллера, и страница никогда не перезагружается с помощью стандартного POST-запроса.
Директива AngularJS ng-submit
ng-отправить Директива в AngularJS используется для привязки приложения к событию отправки браузера. Так что в случае AngularJS в событии отправки вы можете выполнить некоторую обработку внутри самого контроллера, а затем отобразить обработанную информацию пользователю.
Примечание к версии: Поддержка AngularJS 1.x в рамках долгосрочной поддержки прекратилась 31 декабря 2021 года, и команда разработчиков фреймворка это подтверждает. Поддержка AngularJS официально прекращена. В январе 2022 года, поэтому никаких релизов или обновлений безопасности не последовало. Каждый шаг и блок кода ниже сохранены в точности так, как написано, в качестве исторической справки. Новые разработки относятся к современному Angular, который выражает ту же идею, что и... (ngSubmit) привязан к FormGroup.
Как отправить форму в AngularJS с помощью ng-submit
Процессы отправки информации на веб-странице обычно обрабатываются событием отправки в веб-браузере. Это событие обычно используется для отправки информации, которую пользователь мог ввести на веб-странице, на сервер для дальнейшей обработки, например, учетные данные для входа, данные формы и т. д. Отправка информации может осуществляться посредством запроса GET или POST.
Давайте возьмем пример отправки формы Angular, чтобы увидеть, как отправлять формы в AngularJS.
В нашем примере отправки формы AngularJS мы собираемся предоставить пользователю текстовое поле, в котором он сможет ввести тему, которую хочет изучить. На странице будет кнопка «Отправить», при нажатии которой тема будет добавлена в неупорядоченный список.
Иллюстрация ниже tracПоследовательности действий, начиная с темы, введенной в текстовое поле, через кнопку «Отправить» и заканчивая элементом списка, добавленным ниже.

Пример отправки формы 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()">
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 Объяснение:
- Сначала мы объявляем HTML-тег формы, который будет содержать текстовое поле и кнопку отправки, как показано в примере события отправки формы в Angular. Затем мы используем директиву AngularJS ng-submit для привязки функции «Display()» к нашей форме. Эта функция будет определена в нашем контроллере и будет вызываться при отправке формы.
- У нас есть текстовый элемент управления, в котором пользователь вводит тему, которую хочет изучить. Это будет связано с переменной «Тема», которая будет использоваться в нашем контроллере.
- В AngularJS есть обычная кнопка отправки, которую пользователь нажмет, когда войдет в нужную тему.
- Мы использовали нг-повторить Директива для отображения элементов списка тем, которые вводит пользователь. Директива ng-repeat проходит по каждой теме в массиве AllTopic и отображает соответствующее имя темы.
- В нашем контроллере мы объявляем переменную-массив с именем 'AllTopic'. Она будет использоваться для хранения всех тем, введенных пользователем на шаге 2.
- Мы определяем код для нашей функции Display(), которая будет вызываться всякий раз, когда пользователь нажимает кнопку «Отправить». Здесь мы используем функцию push array, чтобы добавить темы, введенные пользователем через переменную «Тема», в наш массив «AllTopic».
Если пример кода формы AngularJS выполнен успешно, при запуске кода в браузере будет показан следующий вывод.
Выход:
Чтобы увидеть работающий код, сначала введите название темы, например «Angular», как показано выше, в текстовом поле, а затем нажмите кнопку «Отправить».
- После нажатия кнопки «Отправить» вы увидите элемент, введенный в текстовое поле, добавленный в список элементов.
- Это достигается с помощью функции Display(), которая вызывается при нажатии кнопки отправки.
- Функция Display() добавляет текст в переменную массива с именем AllTopic. И наша директива ng-repeat проходит через каждое значение в переменной массива AllTopic и отображает их как элементы списка соответственно.
ng-submit против ng-click: какой использовать
Оба формата Директивы AngularJS Они могут вызывать одну и ту же функцию контроллера, но при этом отслеживать разные события браузера. ng-submit сидит на <form> Этот тег реагирует на событие отправки формы, поэтому он также срабатывает, когда пользователь нажимает клавишу Enter в поле ввода. ng-click Нажимается на кнопку и реагирует только на щелчок мыши или аналогичное действие.
| Аспект | ng-отправить | нг-щелчок |
|---|---|---|
| Элемент хоста | тег формы | Любой кликабельный элемент |
| Мероприятие прослушали | Отправить, включая клавишу Enter. | только клик |
| POST-запрос по умолчанию в браузере | Подавлен директивой | Срабатывает кнопка отправки. |
| Доступ к форме состояния | Считывает значения $valid и $invalid в контроллере формы. | Отсутствует собственный контекст формы |
| Естественная посадка | Передача данных формы контроллеру. | Кнопки панели инструментов, ссылки, триггеры модальных окон |
Поддержка клавиатуры обычно решает вопрос выбора. Форма, оснащенная... ng-click Система игнорирует клавишу Enter, что раздражает пользователей при заполнении поля для входа в систему. Зарезервировать ng-click для действий, не связанных с отправкой форм, таких как очистка поля или открытие диалогового окна.
Почему ng-submit препятствует отправке формы по умолчанию в браузере?
Обычная HTML-форма реагирует на событие отправки, сериализуя свои поля и запрашивая у браузера загрузку новой страницы, которая отбрасывает все значения, хранящиеся в ней. $scope, ng-submit Директива предотвращает это: она вызывает preventDefault() Для вас, чтобы выражение выполнялось, а текущая страница оставалась на месте. Нет $event аргументы не требуются, и ручной вызов не требуется.
Подавление имеет одно задокументированное условие. Согласно ngSubmit referenceДействие по умолчанию предотвращается только в том случае, если форма не содержит никаких данных. action, data-action or x-action атрибут. Добавьте любой из них, и браузер продолжит навигацию как обычно после завершения обработчика, что является правильным поведением для формы, отображаемой на сервере с прогрессивной оптимизацией, и неожиданностью во всех остальных случаях.
Поскольку директива "поглощает" объект события, считывайте отправленные значения из свойств, которые нг-модель записаны в область видимости или переданы явно, как в ng-submit="Display(Topic)".
Как проверить форму перед запуском ng-submit
В приведенном выше примере принимается пустая тема, поскольку ничто не проверяет текстовое поле первым. AngularJS создает контроллер формы для каждой именованной формы, и этот контроллер предоставляет флаги, необходимые для контроля отправки. Добавить novalidate Таким образом, браузер оставляет свои собственные HTML5-пузырьки отключенными, а AngularJS — выключенным. проверка формы берет на себя.
- Придайте форме
nameAngularJS публикует контроллер с таким именем в окружающем окружении. контроллер объем. - Добавить
novalidateдля тега формы, чтобы не мешала стандартная проверка данных в браузере. - Отметьте поля, используя
required,ng-minlength,ng-maxlengthorng-pattern. - Защитите обработчика с помощью
$validи передайте контроллер формы, чтобы функция могла проверить отдельные поля. - Отключите кнопку с помощью
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 Это скорее удобство, чем мера безопасности. Значения всё равно должны быть повторно проверены на сервере перед сохранением.


