validar validaciones validacion formularios formulario con campos angularjs

angularjs - validaciones - Validar el campo de formulario solo en el envío o la entrada del usuario



validar formulario en angular (5)

Erik Aigner,

Utilice $ dirty (El campo ha sido modificado) y $ invalid (El contenido del campo no es válido).

Por favor, consulte los ejemplos a continuación para la validación de forma angular

1)

Ejemplo de validación HTML para entradas de entrada de usuario:

<form ng-app="myApp" ng-controller="validateCtrl" name="myForm" novalidate> <p>Email:<br> <input type="email" name="email" ng-model="email" required> <span 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> </form>

2)

Ejemplo de validación HTML / Js para envíos de usuarios:

<form ng-app="myApp" ng-controller="validateCtrl" name="myForm" novalidate form-submit-validation=""> <p>Email:<br> <input type="email" name="email" ng-model="email" required> <span ng-show="submitted || 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"> </p> </form>

Directiva personalizada:

app.directive(''formSubmitValidation'', function () { return { require: ''form'', compile: function (tElem, tAttr) { tElem.data(''augmented'', true); return function (scope, elem, attr, form) { elem.on(''submit'', function ($event) { scope.$broadcast(''form:submit'', form); if (!form.$valid) { $event.preventDefault(); } scope.$apply(function () { scope.submitted = true; }); }); } } }; })

3)

no desea usar la directiva utilizar la función ng-change como a continuación

<form ng-app="myApp" ng-controller="validateCtrl" name="myForm" novalidate ng-change="submitFun()"> <p>Email:<br> <input type="email" name="email" ng-model="email" required> <span ng-show="submitted || 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"> </p> </form>

Controlador SubmitFun () JS:

var app = angular.module(''example'', []); app.controller(''exampleCntl'', function($scope) { $scope.submitFun = function($event) { $scope.submitted = true; if (!$scope.myForm.$valid) { $event.preventDefault(); } }

});

Tengo campos de formulario que se validan usando required . El problema es que el error se muestra inmediatamente cuando se procesa el formulario. Solo quiero que se muestre después de que el usuario ingresó realmente el campo de texto o cuando lo envíe.

¿Cómo puedo implementar esto?


La invocación de la validación en el elemento del formulario se puede manejar activando el evento de cambio en este elemento:

a) ejemplo: activar el cambio en un elemento separado en forma

$scope.formName.elementName.$$element.change();

b) ejemplo: desencadenar un evento de cambio para cada uno de los elementos del formulario, por ejemplo, en ng-submit, ng-click, ng-blur ...

vm.triggerChangeForFormElements = function() { // trigger change event for each of form elements angular.forEach($scope.formName, function (element, name) { if (!name.startsWith(''$'')) { element.$$element.change(); } }); };

c) y una forma más de hacerlo

var handdleChange = function(form){ var formFields = angular.element(form)[0].$$controls; angular.forEach(formFields, function(field){ field.$$element.change(); }); };


Puede usar angularjs formulario estado form.$submitted . Inicialmente, el valor de form.$submitted será false y se cumplirá después de enviar el formulario correctamente.


Si desea mostrar mensajes de error al enviar el formulario, puede usar el form.$submitted condición form.$submitted para verificar si se realizó un intento para enviar el formulario. Ver el siguiente ejemplo.

<form name="myForm" novalidate ng-submit="myForm.$valid && createUser()"> <input type="text" name="name" ng-model="user.name" placeholder="Enter name of user" required> <div ng-messages="myForm.name.$error" ng-if="myForm.$submitted"> <div ng-message="required">Please enter user name.</div> </div> <input type="text" name="address" ng-model="user.address" placeholder="Enter Address" required ng-maxlength="30"> <div ng-messages="myForm.name.$error" ng-if="myForm.$submitted"> <div ng-message="required">Please enter user address.</div> <div ng-message="maxlength">Should be less than 30 chars</div> </div> <button type="submit"> Create user </button> </form>


Use $dirty flag para mostrar el error solo después de que el usuario haya interactuado con la entrada:

<div> <input type="email" name="email" ng-model="user.email" required /> <span ng-show="form.email.$dirty && form.email.$error.required">Email is required</span> </div>

Si desea desencadenar los errores solo después de que el usuario haya enviado el formulario, puede usar una variable de indicador separada como en:

<form ng-submit="submit()" name="form" ng-controller="MyCtrl"> <div> <input type="email" name="email" ng-model="user.email" required /> <span ng-show="(form.email.$dirty || submitted) && form.email.$error.required"> Email is required </span> </div> <div> <button type="submit">Submit</button> </div> </form>

function MyCtrl($scope){ $scope.submit = function(){ // Set the ''submitted'' flag to true $scope.submitted = true; // Send the form to server // $http.post ... } };

Entonces, si todo lo que JS dentro ng-show expresión ng-show parece demasiado para ti, puedes abstraerlo en un método separado:

function MyCtrl($scope){ $scope.submit = function(){ // Set the ''submitted'' flag to true $scope.submitted = true; // Send the form to server // $http.post ... } $scope.hasError = function(field, validation){ if(validation){ return ($scope.form[field].$dirty && $scope.form[field].$error[validation]) || ($scope.submitted && $scope.form[field].$error[validation]); } return ($scope.form[field].$dirty && $scope.form[field].$invalid) || ($scope.submitted && $scope.form[field].$invalid); }; };

<form ng-submit="submit()" name="form"> <div> <input type="email" name="email" ng-model="user.email" required /> <span ng-show="hasError(''email'', ''required'')">required</span> </div> <div> <button type="submit">Submit</button> </div> </form>