ng-submit en AngularJS: Manejo del envío de formularios con un ejemplo

⚡ Resumen inteligente

En AngularJS, ng-submit vincula una función del controlador al evento de envío de un formulario en el navegador, de modo que los valores introducidos se procesan dentro del controlador y la página nunca se recarga mediante un POST predeterminado.

  • 🔘 Función directiva: ng-submit vincula una expresión de AngularJS al evento submit de un elemento de formulario.
  • ☑️ No recargar la página: La solicitud POST predeterminada del navegador se suprime a menos que el formulario contenga un atributo de acción.
  • Ejemplo trabajado: Un cuadro de texto más Display() agrega cada tema al array AllTopic para ng-repeat.
  • 🧪 Puerta de validación: La combinación de $valid con novalidate y ng-disabled bloquea el envío de datos incompletos.
  • 🛠️ Error común: Vincular ng-click al botón de envío junto a ng-submit provoca un doble envío.
  • 📊 Nota de versión: El soporte para AngularJS finalizó en enero de 2022; las versiones modernas de Angular envían los formularios a través de (ngSubmit).

Directiva ng-submit en AngularJS que vincula un evento de envío de formulario a una función del controlador.

Directiva AngularJS ng-submit

El ng-enviar La directiva en AngularJS se utiliza para vincular la aplicación al evento de envío del navegador. Entonces en el caso de AngularJS En el evento de envío, puede realizar algún procesamiento dentro del propio controlador y luego mostrar la información procesada al usuario.

Nota de versión: AngularJS 1.x dejó de tener soporte a largo plazo el 31 de diciembre de 2021, y el equipo del framework confirma que El soporte para AngularJS ha finalizado oficialmente. en enero de 2022, por lo que no hay lanzamientos ni parches de seguridad posteriores. Cada paso y bloque de código a continuación se mantiene exactamente como está escrito, como referencia histórica. El trabajo nuevo pertenece a Angular moderno, que expresa la misma idea que (ngSubmit) vinculado a un FormGroup.

Cómo enviar un formulario en AngularJS usando ng-submit

Los procesos de envío de información en una página web normalmente los maneja el evento de envío en el navegador web. Este evento normalmente se utiliza para enviar información que el usuario podría haber ingresado en una página web al servidor para su posterior procesamiento, como credenciales de inicio de sesión, datos de formulario, etc. El envío de información se puede realizar mediante una solicitud GET o POST.

Tomemos un ejemplo de envío de formulario Angular para ver cómo enviar formularios en AngularJS.

En nuestro ejemplo de envío de formulario de AngularJS, presentaremos un cuadro de texto al usuario en el que podrá ingresar el tema que desea aprender. Habrá un botón de envío en la página que, al presionarlo, agregará el tema a una lista desordenada.

La ilustración a continuación traces que fluyen, desde el tema escrito en el cuadro de texto, a través del botón Enviar, hasta el elemento de la lista agregado debajo.

Formulario de AngularJS con un cuadro de texto para el tema, un botón de envío y la lista desordenada resultante de temas.
Enviar un formulario en AngularJS usando ng-submit

Ejemplo de envío de formulario AngularJS

Ahora, veremos un ejemplo de envío de formulario AngularJS desde el controlador usando la directiva 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 Explicación:

  1. Primero, declaramos la etiqueta HTML de nuestro formulario, que contendrá el cuadro de texto y el botón de envío, como se muestra en el ejemplo del evento de envío de formulario de Angular. Luego, usamos la directiva ng-submit de AngularJS para vincular la función Display() a nuestro formulario. Esta función se definirá en nuestro controlador y se llamará cuando se envíe el formulario.
  2. Contamos con un control de texto en el cual el usuario ingresará el Tema que desea aprender. Esto estará vinculado a una variable llamada "Tema" que se utilizará en nuestro controlador.
  3. Existe el botón de envío normal en AngularJS en el que el usuario hará clic cuando haya ingresado el tema que desea.
  4. Hemos usado el ng-repetir directiva para mostrar elementos de la lista de los temas que ingresa el usuario. La directiva ng-repeat recorre cada tema en la matriz 'AllTopic' y muestra el nombre del tema en consecuencia.
  5. En nuestro controlador, declaramos una variable de tipo array llamada 'AllTopic'. Esta se utilizará para almacenar todos los temas introducidos por el usuario en el paso 2.
  6. Estamos definiendo el código para nuestra función Display() que se llamará cada vez que el usuario haga clic en el botón Enviar. Aquí estamos usando la función de matriz de inserción para agregar los temas ingresados ​​por el usuario a través de la variable "Tema" en nuestra matriz "Todos los temas".

Si el código de ejemplo del formulario AngularJS se ejecuta correctamente, se mostrará la siguiente salida cuando ejecute el código en el navegador.
Salida:

Salida del navegador del ejemplo ng-submit de AngularJS que muestra el cuadro de texto del tema vacío y el botón Enviar.

Para ver el código funcionando, primero ingrese un nombre de tema como “Angular” como se muestra arriba en el cuadro de texto y luego haga clic en el botón Enviar.

Salida de AngularJS ng-submit después de hacer clic en Enviar, con el tema ingresado agregado a la lista.

  • Después de hacer clic en el botón Enviar, verá el elemento que se ingresó en el cuadro de texto agregado a la lista de elementos.
  • Esto se logra mediante la función Display(), que se llama cuando se presiona el botón de enviar.
  • La función Display() agrega el texto a la variable de matriz llamada 'AllTopic'. Y nuestra directiva ng-repeat pasa por cada valor en la variable de matriz 'AllTopic' y los muestra como elementos de lista en consecuencia.

ng-submit vs ng-click: cuál usar

Ambos Directivas de AngularJS Pueden llamar a la misma función del controlador, pero escuchan diferentes eventos del navegador. ng-submit se sienta en el <form> La etiqueta reacciona al evento de envío, por lo que también se activa cuando un usuario presiona Enter dentro de un campo. ng-click Se sitúa sobre un botón y reacciona únicamente a un clic del ratón o a una activación equivalente.

Aspecto ng-enviar ng-clic
Elemento anfitrión La etiqueta de formulario Cualquier elemento en el que se pueda hacer clic
Evento escuchado enviar, incluyendo la tecla Enter solo clic
POST del navegador predeterminado Suprimido por la directiva Todavía se dispara desde un botón de envío
Acceso al formulario estatal Lee $valid y $invalid en el controlador del formulario. No tiene contexto formal propio
Ajuste natural Entrega de datos de formulario a un controlador Botones de la barra de herramientas, enlaces, activadores modales

La compatibilidad con teclado suele ser determinante para la elección. Un formulario con cable ng-click Solo ignora la tecla Enter, lo que frustra a los usuarios que completan un cuadro de inicio de sesión. Reservar ng-click para acciones que no sean el envío de formularios, como borrar un campo o abrir un cuadro de diálogo.

¿Por qué ng-submit impide el envío predeterminado del navegador?

Un formulario HTML simple reacciona a un evento de envío serializando sus campos y pidiéndole al navegador que cargue una nueva página, que descarta cada valor contenido en $scope. La función de ng-submit La directiva impide que eso suceda: llama preventDefault() para ti, de modo que la expresión se ejecuta y la página actual permanece en su lugar. No $event No se requiere ningún argumento ni llamada manual.

La supresión tiene una condición documentada. Según la Referencia de ngSubmit, la acción predeterminada se impide solo mientras el formulario no contiene action, data-action or x-action atributo. Agregue cualquiera de esos y el navegador navegará como de costumbre después de que el controlador termine, que es el comportamiento correcto para un formulario renderizado en el servidor con mejora progresiva y una sorpresa en cualquier otro caso.

Debido a que la directiva absorbe el objeto de evento, lea los valores enviados de las propiedades que modelo ng escribir en el ámbito, o pasarlos explícitamente, como en ng-submit="Display(Topic)".

Cómo validar un formulario antes de que se ejecute ng-submit

El ejemplo anterior acepta un tema vacío, porque nada comprueba primero el cuadro de texto. AngularJS crea un controlador de formulario para cada formulario con nombre, y ese controlador expone las banderas necesarias para controlar el envío. Agregar novalidate por lo que el navegador deja sus propias burbujas HTML5 desactivadas y AngularJS validación de formulario se hace cargo.

  1. Dale al formulario un nameAngularJS publica un controlador con ese nombre en el entorno. controlador alcance.
  2. Agregar novalidate a la etiqueta del formulario para que la validación nativa del navegador no interfiera.
  3. Marque los campos, usando required, ng-minlength, ng-maxlength or ng-pattern.
  4. Proteja al manejador con $validy pasar el controlador del formulario para que la función pueda inspeccionar los campos individuales.
  5. Deshabilitar el botón con ng-disabled señalando a $invalid, que proporciona retroalimentación visual inmediata.
<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>

La mayoría de los problemas reportados con este patrón se deben a dos errores:

  • Double sumisión. Encuadernación ng-click en el botón de enviar mientras ng-submit Se coloca en el formulario y ejecuta el controlador dos veces, una vez por evento. La documentación oficial advierte que no se deben combinar los dos controladores, así que elija uno.
  • Envíos inesperados. Cualquier botón dentro de un formulario sin type="button" Genera el evento de envío. Marque explícitamente los botones de cancelar y restablecer; de lo contrario, también activarán el controlador.

Vigilando en $valid Es una medida de conveniencia, no un control de seguridad. Los valores aún deben validarse nuevamente en el servidor antes de ser almacenados.

Preguntas Frecuentes

Sí. Un formulario que contiene un campo de entrada o un botón de tipo "submit" activa el evento "submit" cuando se presiona la tecla Enter dentro de un campo, por lo que la expresión ng-submit se ejecuta sin ningún controlador de teclas adicional.

No. Solo los elementos de formulario generan el evento de envío que la directiva escucha. Mueva ng-submit a la etiqueta del formulario o adjunte ng-click al elemento al que realmente desea reaccionar.

ng-submit no pasa argumentos. Lea las propiedades del ámbito que ng-model ha rellenado, o páselas explícitamente, por ejemplo ng-submit=”Display(Topic)” o ng-submit=”Display(topicForm)”.

Sí. Cada elemento del formulario tiene su propio controlador, así que asigna a cada formulario un nombre único y vincúlalo a un manejador independiente. Compartir una función entre formularios puede provocar conflictos de ámbito.

El manejador dispara de cualquier manera, pero un campo sin modelo ng Nunca escribe su valor en $scope, por lo que la función no puede leerlo. Vincula cada entrada que planees procesar.

Compila el formulario en una prueba, establece el valor del modelo en el ámbito, activa un evento de envío y, a continuación, verifica el array o la llamada al servicio que produce el controlador. Karma con Jasmine sigue siendo la combinación habitual.

Los modelos de lenguaje leen la forma del modelo y el borrador requerido, los atributos ng-pattern y ng-minlength, además de los mensajes coincidentes, lo que convierte gran parte de AngularJS en... validación de formulario incorporarlo a una etapa de revisión.

Copiloto de GitHub El modo agente reescribe una plantilla en (ngSubmit) con FormGroup y genera la clase del componente, pero los validadores generados y las llamadas asíncronas aún necesitan revisión y pruebas humanas.

Resumir este post con: