ng-submit no AngularJS: Lidando com o envio de formulários com exemplos
⚡ Resumo Inteligente
Em AngularJS, o ng-submit vincula uma função do controlador ao evento de envio de formulário do navegador, de forma que os valores inseridos sejam processados dentro do controlador e a página nunca seja recarregada por meio de um POST padrão.
Diretiva AngularJS ng-submit
O ng-enviar A diretiva em AngularJS é usada para vincular o aplicativo ao evento de envio do navegador. Então no caso de AngularJS no evento submit, você pode realizar algum processamento dentro do próprio controlador e depois exibir as informações processadas ao usuário.
Nota de versão: O AngularJS 1.x deixou de ter suporte de longo prazo em 31 de dezembro de 2021, e a equipe do framework confirma isso. O suporte ao AngularJS foi oficialmente encerrado. Em janeiro de 2022, portanto, não haverá lançamentos ou correções de segurança subsequentes. Cada etapa e bloco de código abaixo é mantido exatamente como foi escrito, como referência histórica. Novos trabalhos pertencem ao Angular moderno, que expressa a mesma ideia que (ngSubmit) vinculado a um FormGroup.
Como enviar um formulário em AngularJS usando ng-submit
Os processos de envio de informações em uma página da web são normalmente gerenciados pelo evento submit no navegador da web. Este evento é normalmente usado para enviar informações que o usuário possa ter inserido em uma página web para o servidor para processamento posterior, como credenciais de login, dados de formulário, etc. O envio de informações pode ser feito através de solicitação GET ou POST.
Vamos dar um exemplo de envio de formulário Angular para ver como enviar formulários em AngularJS.
Em nosso exemplo de envio de formulário AngularJS, apresentaremos uma caixa de texto ao usuário na qual ele poderá inserir o tópico que deseja aprender. Haverá um botão enviar na página, que quando pressionado adicionará o tópico a uma lista não ordenada.
A ilustração abaixo traces que fluem, desde o tópico digitado na caixa de texto, passando pelo botão Enviar, até o item da lista adicionado abaixo.

Exemplo de envio de formulário AngularJS
Agora, veremos um exemplo de envio de formulário AngularJS do Controller usando a diretiva 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 Explicação:
- Primeiramente, declaramos a tag HTML do formulário, que conterá o campo de texto e o botão de envio, conforme mostrado no exemplo de evento de envio de formulário do Angular. Em seguida, utilizamos a diretiva ng-submit do AngularJS para associar a função "Display()" ao nosso formulário. Essa função será definida em nosso controlador e será chamada quando o formulário for enviado.
- Temos um controle de texto no qual o usuário irá inserir o Tópico que deseja aprender. Isto estará vinculado a uma variável chamada 'Topic' que será usada em nosso controlador.
- Existe o botão de envio normal no AngularJS no qual o usuário clicará quando inserir o tópico desejado.
- Nós usamos o ng-repetir diretiva para exibir itens de lista dos tópicos que o usuário insere. A diretiva ng-repeat percorre cada tópico na matriz 'AllTopic' e exibe o nome do tópico de acordo.
- Em nosso controlador, estamos declarando uma variável de array chamada 'AllTopic'. Ela será usada para armazenar todos os tópicos inseridos pelo usuário na Etapa 2.
- Estamos definindo o código para nossa função Display() que será chamada sempre que o usuário clicar no botão Enviar. Aqui estamos usando a função push array para adicionar os tópicos inseridos pelo usuário por meio da variável 'Topic' em nosso array 'AllTopic'.
Se o código de exemplo do formulário AngularJS for executado com sucesso, a seguinte saída será mostrada quando você executar seu código no navegador.
Saída:
Para ver o código funcionando, primeiro insira um nome de tópico como “Angular” conforme mostrado acima na caixa de texto e depois clique no botão Enviar.
- Após clicar no botão enviar, você verá o item que foi inserido na caixa de texto adicionado à lista de itens.
- Isso está sendo conseguido pela função Display(), que é chamada quando o botão enviar é pressionado.
- A função Display() adiciona o texto à variável de array chamada 'AllTopic'. E nossa diretiva ng-repeat passa por cada valor na variável de array 'AllTopic' e os exibe como itens de lista de acordo.
ng-submit vs ng-click: qual usar
Ambos Diretivas do AngularJS Podem chamar a mesma função do controlador, mas escutam eventos diferentes do navegador. ng-submit senta no <form> A tag reage ao evento de envio, portanto, também é acionada quando um usuário pressiona Enter dentro de um campo. ng-click Fica posicionado sobre um botão e reage apenas a um clique do mouse ou a uma ativação equivalente.
| Aspecto | ng-enviar | ng-clique |
|---|---|---|
| Elemento hospedeiro | A tag de formulário | Qualquer elemento clicável |
| Evento ouvido | Enviar, incluindo a tecla Enter. | clique apenas |
| Navegador padrão POST | Suprimido pela diretiva | Ainda dispara a partir de um botão de envio |
| Acesso ao estado do formulário | Lê $valid e $invalid no controlador do formulário. | Sem contexto formal próprio |
| Ajuste natural | Entregar dados de formulário a um controlador | Botões da barra de ferramentas, links, gatilhos modais |
O suporte para teclado geralmente define a escolha. Um formulário com fio com ng-click O recurso sozinho ignora a tecla Enter, o que frustra os usuários que preenchem um campo de login. Reserve ng-click Para ações que não sejam envios de formulário, como limpar um campo ou abrir uma caixa de diálogo.
Por que o ng-submit impede o envio padrão do navegador?
Um formulário HTML simples reage a um evento de envio serializando seus campos e solicitando ao navegador que carregue uma nova página, que descarta todos os valores armazenados. $scope. O ng-submit A diretiva impede que isso aconteça: ela chama preventDefault() Para você, a expressão é executada e a página atual permanece no lugar. Não. $event Argumentos e nenhuma chamada manual são necessários.
A supressão tem uma condição documentada. De acordo com o ngSubmit referênciaA ação padrão é impedida apenas enquanto o formulário não contiver nenhum campo. action, data-action or x-action Adicione qualquer um desses atributos e o navegador navegará normalmente após a conclusão do manipulador, o que é o comportamento correto para um formulário renderizado progressivamente no servidor e uma surpresa em todos os outros casos.
Como a diretiva absorve o objeto de evento, leia os valores enviados das propriedades que modelo ng escreveu no escopo ou passou-os explicitamente, como em ng-submit="Display(Topic)".
Como validar um formulário antes da execução do ng-submit
O exemplo acima aceita um tópico vazio, porque nada verifica a caixa de texto primeiro. O AngularJS cria um controlador de formulário para cada formulário nomeado, e esse controlador expõe os sinalizadores necessários para controlar o envio. novalidate assim o navegador deixa suas próprias bolhas HTML5 desativadas e o AngularJS validação de formulário assume.
- Dê o formulário a
nameO AngularJS publica um controlador com esse nome no ambiente ao redor. controlador escopo. - Adicione
novalidatepara a tag de formulário, de forma que a validação nativa do navegador não interfira. - Marque os campos, usando
required,ng-minlength,ng-maxlengthorng-pattern. - Proteja o tratador com
$validE passe o controlador do formulário como argumento para que a função possa inspecionar os campos individualmente. - Desative o botão com
ng-disabledapontando para$invalid, que fornece feedback visual imediato.
<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>
A maioria dos problemas relatados com esse padrão envolve dois erros:
- Double submissão. Confeção
ng-clickno botão de envio enquantong-submitO formulário executa o manipulador duas vezes, uma vez por evento. A documentação oficial alerta contra a combinação dos dois manipuladores, portanto, escolha apenas um. - Envios inesperados. Qualquer botão dentro de um formulário sem
type="button"Aciona o evento de envio. Marque explicitamente os botões de cancelar e redefinir; caso contrário, eles também acionarão o manipulador.
Guardando em $valid É uma conveniência, não um controle de segurança. Os valores ainda precisam ser revalidados no servidor antes de serem armazenados.


