Validación de formulario AngularJS
AngularJS puede validar datos de entrada.
Validación de formulario
AngularJS ofrece validación de formularios del lado del cliente.
AngularJS supervisa el estado del formulario y los campos de entrada (entrada, área de texto, selección) y le permite notificar al usuario sobre el estado actual.
AngularJS también contiene información sobre si se han tocado, modificado o no.
Puede usar atributos estándar de HTML5 para validar la entrada o puede crear sus propias funciones de validación.
La validación del lado del cliente no puede por sí sola asegurar la entrada del usuario. La validación del lado del servidor también es necesaria.
Requerido
Use el atributo HTML5 required
para especificar que el campo de entrada debe completarse:
Ejemplo
El campo de entrada es obligatorio:
<form name="myForm">
<input name="myInput" ng-model="myInput"
required>
</form>
<p>The input's valid state is:</p>
<h1>{{myForm.myInput.$valid}}</h1>
Correo electrónico
Utilice el tipo HTML5 email
para especificar que el valor debe ser un correo electrónico:
Ejemplo
El campo de entrada tiene que ser un correo electrónico:
<form name="myForm">
<input name="myInput" ng-model="myInput"
type="email">
</form>
<p>The input's valid state is:</p>
<h1>{{myForm.myInput.$valid}}</h1>
Estado de formulario y estado de entrada
AngularJS actualiza constantemente el estado tanto del formulario como de los campos de entrada.
Los campos de entrada tienen los siguientes estados:
$untouched
El campo aún no ha sido tocado.$touched
El campo ha sido tocado$pristine
El campo aún no ha sido modificado.$dirty
El campo ha sido modificado.$invalid
El contenido del campo no es válido.$valid
El contenido del campo es válido.
Todas son propiedades del campo de entrada y son true
o false
.
Los formularios tienen los siguientes estados:
$pristine
Ningún campo ha sido modificado todavía$dirty
Uno o más han sido modificados$invalid
El contenido del formulario no es válido.$valid
El contenido del formulario es válido.$submitted
El formulario se envía
Todas son propiedades de la forma y son true
o bien false
.
Puede usar estos estados para mostrar mensajes significativos al usuario. Por ejemplo, si un campo es obligatorio y el usuario lo deja en blanco, debe advertir al usuario:
Ejemplo
Mostrar un mensaje de error si se ha tocado el campo Y está vacío:
<input name="myName" ng-model="myName" required>
<span ng-show="myForm.myName.$touched
&& myForm.myName.$invalid">The name is required.</span>
Clases CSS
AngularJS agrega clases de CSS a formularios y campos de entrada según sus estados.
Las siguientes clases se agregan o eliminan de los campos de entrada:
ng-untouched
El campo aún no ha sido tocado.ng-touched
El campo ha sido tocadong-pristine
El campo aún no ha sido modificado.ng-dirty
El campo ha sido modificado.ng-valid
El contenido del campo es válido.ng-invalid
El contenido del campo no es válido.ng-valid-key
Una clave para cada validación. Ejemplo:ng-valid-required
, útil cuando hay más de una cosa que se debe validarng-invalid-key
Ejemplo:ng-invalid-required
Las siguientes clases se agregan o eliminan de los formularios:
ng-pristine
Ningún campo no ha sido modificado todavíang-dirty
Uno o más campos han sido modificadosng-valid
El contenido del formulario es válido.ng-invalid
El contenido del formulario no es válido.ng-valid-key
Una clave para cada validación. Ejemplo:ng-valid-required
, útil cuando hay más de una cosa que se debe validarng-invalid-key
Ejemplo:ng-invalid-required
Las clases se eliminan si el valor que representan es false
.
Agregue estilos para estas clases para darle a su aplicación una interfaz de usuario mejor y más intuitiva.
Ejemplo
Aplicar estilos, usando CSS estándar:
<style>
input.ng-invalid {
background-color: pink;
}
input.ng-valid {
background-color: lightgreen;
}
</style>
Los formularios también se pueden diseñar:
Ejemplo
Aplique estilos para formularios no modificados (prístinos) y para formularios modificados:
<style>
form.ng-pristine {
background-color: lightblue;
}
form.ng-dirty {
background-color: pink;
}
</style>
Validación personalizada
Crear su propia función de validación es un poco más complicado; Debe agregar una nueva directiva a su aplicación y lidiar con la validación dentro de una función con ciertos argumentos específicos.
Ejemplo
Cree su propia directiva, que contenga una función de validación personalizada, y consúltela mediante my-directive
.
El campo solo será válido si el valor contiene el carácter "e":
<form name="myForm">
<input name="myInput" ng-model="myInput" required
my-directive>
</form>
<script>
var app = angular.module('myApp',
[]);
app.directive('myDirective', function() {
return {
require: 'ngModel',
link: function(scope, element,
attr, mCtrl) {
function myValidation(value)
{
if (value.indexOf("e") > -1)
{
mCtrl.$setValidity('charE',
true);
} else {
mCtrl.$setValidity('charE', false);
}
return value;
}
mCtrl.$parsers.push(myValidation);
}
};
});
</script>
Ejemplo explicado:
En HTML, se hará referencia a la nueva directiva mediante el atributo
my-directive
.
En JavaScript comenzamos agregando una nueva directiva llamada myDirective
.
Recuerde, al nombrar una directiva, debe usar un nombre camel case,
myDirective
, pero al invocarla, debe usar -
un nombre separado,
my-directive
.
Luego, devuelva un objeto donde especifique que requerimos ngModel
, que es el ngModelController.
Haga una función de enlace que tome algunos argumentos, donde el cuarto argumento, mCtrl
, es ngModelController
,
Luego especifique una función, en este caso llamada myValidation
, que toma un argumento, este argumento es el valor del elemento de entrada.
Pruebe si el valor contiene la letra "e" y establezca la validez del controlador del modelo en true
o false
.
Por último, mCtrl.$parsers.push(myValidation);
agregará la
myValidation
función a una matriz de otras funciones, que se ejecutarán cada vez que cambie el valor de entrada.
Ejemplo de validación
<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
<body>
<h2>Validation Example</h2>
<form ng-app="myApp"
ng-controller="validateCtrl"
name="myForm" novalidate>
<p>Username:<br>
<input type="text" name="user" ng-model="user"
required>
<span style="color:red" ng-show="myForm.user.$dirty &&
myForm.user.$invalid">
<span ng-show="myForm.user.$error.required">Username
is required.</span>
</span>
</p>
<p>Email:<br>
<input type="email" name="email" ng-model="email" required>
<span
style="color:red" ng-show="myForm.email.$dirty && myForm.email.$invalid">
<span ng-show="myForm.email.$error.required">Email is required.</span>
<span ng-show="myForm.email.$error.email">Invalid email address.</span>
</span>
</p>
<p>
<input type="submit"
ng-disabled="myForm.user.$dirty && myForm.user.$invalid ||
myForm.email.$dirty && myForm.email.$invalid">
</p>
</form>
<script>
var app = angular.module('myApp', []);
app.controller('validateCtrl',
function($scope) {
$scope.user = 'John Doe';
$scope.email = '[email protected]';
});
</script>
</body>
</html>
El atributo de formulario HTML novalidate se usa para deshabilitar la validación predeterminada del navegador.
Ejemplo explicado
La directiva ng-model de AngularJS vincula los elementos de entrada al modelo.
El objeto modelo tiene dos propiedades: usuario y correo electrónico .
Debido a ng-show , los intervalos con color: red se muestran solo cuando el usuario o el correo electrónico están $sucios y $inválidos .