Validation de formulaire AngularJS lors de la soumission : $dirty, $valid et $invalid
โก Rรฉsumรฉ intelligent
La validation de formulaires dans AngularJS vรฉrifie que les donnรฉes saisies dans un formulaire sont correctes et complรจtes avant leur envoi au serveur. Quatre approches sont prรฉsentรฉes ici, allant des attributs HTML5 simples aux modules de validation automatique, en passant par les propriรฉtรฉs de portรฉe.

Validation de formulaire dans AngularJS
Validation du formulaire Dans AngularJS, la validation consiste ร vรฉrifier l'exactitude et l'exhaustivitรฉ des donnรฉes saisies dans un formulaire. Lorsqu'un utilisateur soumet le formulaire, une validation est effectuรฉe avant l'envoi des donnรฉes au serveur. Ce processus de validation garantit, dans la mesure du possible, que les champs de saisie ont รฉtรฉ correctement remplis.
Prenons l'exemple concret d'un site exigeant de remplir un formulaire d'inscription avant d'accorder un accรจs complet. La page d'inscription comporterait des champs pour le nom d'utilisateur, le mot de passe, l'adresse รฉlectronique, etc.
Par exemple, l'adresse e-mail doit toujours รชtre au format suivant : nom d'utilisateur@site.domaineSi un utilisateur ne saisit que son nom d'utilisateur, la validation doit รฉchouer. La validation effectue ces vรฉrifications de base avant l'envoi des donnรฉes au serveur pour traitement.
โ ๏ธ Note de version : AngularJS (branche 1.x) a atteint sa fin de vie le 31 dรฉcembre 2021 et ne bรฉnรฉficie plus de correctifs de sรฉcuritรฉ. Les techniques dรฉcrites ci-dessous restent valables pour les applications existantes ; Angular moderne gรจre la mรชme tรขche avec des formulaires rรฉactifs ou pilotรฉs par modรจle.
Validation du formulaire ร l'aide de HTML5
La validation de formulaire consiste ร prรฉvalider les informations saisies dans un formulaire web avant leur envoi au serveur. La validation cรดtรฉ client est prรฉfรฉrable, car elle engendre une surcharge bien moindre que la rรฉaffichage du formulaire aprรจs chaque aller-retour.
L'exemple ci-dessous prรฉsente un formulaire d'inscription simple dans lequel l'utilisateur saisit un nom d'utilisateur, un mot de passe, une adresse รฉlectronique et son รขge. Le formulaire comporte des contrรดles de validation qui garantissent l'exactitude des informations saisies.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Event Registration</title> <link rel="stylesheet" href="lib/bootstrap.css"> <script src="https://code.angularjs.org/1.8.3/angular.min.js"></script> </head> <body ng-app="sampleApp"> <h1>Guru99 Global Event</h1> <form> Enter your user name: <input type="text" name="name" required><br><br> Enter your password: <input type="password" name="password"><br><br> Enter your email: <input type="email" name="email"><br><br> Enter your age: <input type="number" name="age"><br><br> <input type="submit" value="Submit"> </form> </body> </html>
โ ๏ธ Des corrections ont รฉtรฉ apportรฉes ร chaque annonce sur cette page. Les originaux ont dรฉclarรฉ chrset="UTF 8", ce qui n'est ni un attribut valide ni un encodage valide, et a chargรฉ AngularJS trois fois โ angular-route.js premiรจrement, ce qui provoque une erreur car le module de routage s'enregistre auprรจs d'un framework qui n'a pas รฉtรฉ chargรฉ, puis angular.min.js et angular.js, la mรชme bibliothรจque deux fois. Ils ont รฉgalement retirรฉ bootstrap.css ร travers un <script> L'รฉtiquette `<style>` empรชchait l'application d'un style. Chaque fiche charge dรฉsormais une bibliothรจque (version 1.8.3) et lie correctement la feuille de style. Le remplissage de la mise en page est constituรฉ de plusieurs รฉlรฉments. Les entitรฉs ont รฉtรฉ supprimรฉes.
Code Explication
- Pour le type de saisie de texte, le
requiredCet attribut signifie que la zone de texte ne peut pas รชtre vide lors de la soumission du formulaire. - Le type de saisie suivant est le mot de passe. Comme il s'agit d'un mot de passe, le texte saisi dans ce champ est masquรฉ.
- รtant donnรฉ que le type de saisie est spรฉcifiรฉ comme adresse e-mail, le texte dans la zone doit correspondre au modรจle. nom@site.domaine.
- Lorsque le type d'entrรฉe est indiquรฉ comme numรฉrique, les caractรจres saisis au clavier ne sont tout simplement pas acceptรฉs par le champ.
Sortie
Pour voir la validation en action, cliquez sur Soumettre sans rien saisir.
Une fenรชtre contextuelle s'affiche indiquant que le champ doit รชtre rempli ; par consรฉquent, le champ marquรฉ comme obligatoire bloque la soumission lorsqu'il est laissรฉ vide.
La saisie d'une valeur dans le champ du mot de passe affiche le symbole '*' masquant les caractรจres.
Saisir une adresse e-mail incorrecte et cliquer sur ยซ Envoyer ยป fait apparaรฎtre une fenรชtre contextuelle demandant le symbole @. Enfin, les caractรจres saisis dans le champ ยซ รขge ยป n'apparaissent jamais, car ce champ n'accepte que des chiffres.
Les fenรชtres contextuelles du navigateur sont rapides ร configurer, mais leur texte et leur style ne peuvent pas รชtre modifiรฉs. C'est lร que les propriรฉtรฉs de validation d'AngularJS entrent en jeu.
Validation du formulaire en utilisant $dirty, $valid, $invalid, $pristine
AngularJS fournit ses propres propriรฉtรฉs pour la validation. Les propriรฉtรฉs suivantes sont exposรฉes sur chaque contrรดle nommรฉ :
- $sale โ Lโutilisateur a interagi avec le contrรดle
- $valide โ Le contenu du champ est valide
- $ invalide โ Le contenu du champ n'est pas valide
- $vierge โ Lโutilisateur nโa pas encore interagi avec le contrรดle
Vous trouverez ci-dessous les รฉtapes ร suivre pour effectuer une validation AngularJS.
รtape 1) Utilisez le bouton novalidate Cette propriรฉtรฉ est utilisรฉe lors de la dรฉclaration du formulaire. Elle indique au navigateur que la validation sera gรฉrรฉe par AngularJS.
รtape 2) Assurez-vous que le formulaire possรจde un nom, car ce nom est utilisรฉ pour atteindre l'รฉtat de validation.
รtape 3) Assurez-vous que chaque commande possรจde รฉgalement un name Pour la mรชme raison, un contrรดle sans nom n'est jamais enregistrรฉ sur le formulaire.
รtape 4) Utilisez le bouton ng-show directive permettant de vรฉrifier les propriรฉtรฉs $dirty, $invalid et $valid.
L'exemple ci-dessous comporte un unique champ de texte dans lequel l'utilisateur saisit le nom d'un sujet. Si ce champ est laissรฉ vide, une erreur de validation est dรฉclenchรฉe et un message s'affiche.
<form ng-app="DemoApp" ng-controller="DemoController" name="myForm" novalidate> <p>Topic Name:<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> <input type="submit" ng-disabled="myForm.$invalid"> </p> </form> <script> var app = angular.module("DemoApp", []); app.controller("DemoController", function($scope) { // Seed the textbox so the form starts in a valid state $scope.user = "AngularJS"; }); </script>
โ ๏ธ Deux erreurs logiques corrigรฉes. La version originale dรฉsactivait le bouton avec ng-disabled="myForm.user.$dirty && myForm.user.$invalid". Car $dirty La condition est fausse jusqu'ร ce que l'utilisateur touche le champ ; le bouton reste dรฉsactivรฉ. activรฉ sur un formulaire vierge intact, le cas prรฉcis qu'il รฉtait censรฉ bloquer ; myForm.$invalid couvre les deux. L'original encapsulait รฉgalement la valeur par dรฉfaut dans $scope.Display = function () { $scope.user = 'Angular'; }Une fonction n'ayant jamais รฉtรฉ appelรฉe, la zone de texte s'est ouverte vide malgrรฉ le texte indiquant ยซ AngularJS ยป. L'affectation se fait dรฉsormais directement, la valeur รฉtant entre guillemets.
Code Explication
- Le formulaire est nommรฉ ยซ myForm ยป. Ce nom est nรฉcessaire pour accรฉder ร ses champs de validation.
- Le
novalidateCette propriรฉtรฉ empรชche le navigateur de valider le processus, permettant ainsi ร AngularJS de s'en charger. - La directive ng-show vรฉrifie les propriรฉtรฉs ยซ $dirty ยป et ยซ $invalid ยป. Si le champ de texte a รฉtรฉ modifiรฉ, $dirty vaut vrai ; sโil est vide, $invalid vaut vrai. Lorsque les deux propriรฉtรฉs sont vraies, le texte en rouge est affichรฉ.
- La vรฉrification imbriquรฉe lit la propriรฉtรฉ ยซ $error.required ยป, qui est vraie chaque fois qu'un contrรดle obligatoire n'a pas de valeur, et affiche ยซ Le nom d'utilisateur est obligatoire ยป.
- Le bouton de soumission est dรฉsactivรฉ via
ng-disabledlorsque le formulaire dans son ensemble est invalide. - Le contrรดleur dรฉfinit la valeur initiale du champ de texte sur ยซ AngularJS ยป, de sorte que le formulaire s'ouvre dans un รฉtat valide et que la validation est plus facile ร observer lorsque le texte est supprimรฉ.
Sortie
Lors du premier affichage du formulaire, la zone de texte affiche ยซ AngularJS ยป et le bouton ยซ Envoyer ยป est activรฉ. Dรจs que le texte est supprimรฉ, un message dโerreur apparaรฎt et le bouton se dรฉsactive.
La capture d'รฉcran ci-dessus montre deux choses :
- Le bouton ยซ Envoyer ยป est dรฉsactivรฉ.
- Aucun nom de sujet n'est renseignรฉ dans le champ ยซ Sujet ยป, le message d'erreur ยซ Nom d'utilisateur requis ยป s'affiche.
Comment afficher les erreurs de validation avec ngMessages
Le modรจle ci-dessus fonctionne, mais il n'est pas รฉvolutif. Un champ avec quatre contraintes nรฉcessite quatre รฉlรฉments imbriquรฉs. ng-show des plages, et lorsque plusieurs d'entre elles tombent en panne simultanรฉment, tous les messages apparaissent ensemble. ngMessages Ce module, fourni sรฉparรฉment par l'รฉquipe AngularJS, rรฉsout les deux problรจmes : il affiche un message ร la fois, dans l'ordre oรน les messages sont รฉcrits.
Chargez le module et ajoutez-le comme dรฉpendance.
<script src="https://code.angularjs.org/1.8.3/angular-messages.js"></script> <script> angular.module("DemoApp", ["ngMessages"]); </script>
Le balisage se lit alors comme une liste de rรจgles plutรดt que comme une pile de conditions.
<input type="text" name="user" ng-model="user" required ng-minlength="4" ng-maxlength="20"> <div style="color:red" ng-messages="myForm.user.$error" ng-if="myForm.user.$dirty"> <div ng-message="required">A topic name is required</div> <div ng-message="minlength">Use at least 4 characters</div> <div ng-message="maxlength">Use no more than 20 characters</div> </div>
Trois dรฉtails expliquent son bon fonctionnement en pratique. ng-messages points d'attribut au niveau du contrรดle $error L'objet est utilisรฉ plutรดt qu'une valeur boolรฉenne, ce qui รฉvite de rรฉpรฉter une condition. Seule la premiรจre correspondance est prise en compte. ng-message Cela signifie qu'un champ vide est signalรฉ comme obligatoire au lieu de signaler รฉgalement sa longueur. ng-messages-multiple ce comportement s'inverse lorsque chaque dรฉfaillance doit rรฉellement รชtre rรฉpertoriรฉe.
enveloppeping le bloc dans ng-if="myForm.user.$dirty" maintient le formulaire silencieux jusqu'ร ce que l'utilisateur ait saisi quelque chose. $touched pour $dirty retarde encore le message, jusqu'ร ce que l'attention se dรฉtourne du sujet, ce qui est gรฉnรฉralement le choix le plus convivial sur un long formulaire d'inscription.
Une mise en garde: ngMessages Le script est distribuรฉ sous forme de fichier sรฉparรฉ ; oublier la balise script ou la dรฉpendance au module ne fait donc rien afficher dans le bloc, sans aucune erreur dans la console pour lโexpliquer.
La rรฉdaction manuelle des messages est prรฉcise mais rรฉpรฉtitive. La section suivante prรฉsente un module qui les gรฉnรจre automatiquement.
Validation du formulaire ร l'aide de la validation automatique AngularJS
AngularJS peut valider automatiquement tous les champs d'un formulaire, sans nรฉcessiter de code personnalisรฉ pour la validation ou les messages d'erreur. Ceci est possible grรขce ร l'intรฉgration d'un module communautaire appelรฉ ยซ jcs-autoValidate ยป.
Grรขce ร ce module, aucun code spรฉcifique n'est nรฉcessaire pour exรฉcuter la validation ou afficher les messages ; tout est gรฉrรฉ par jcs-autoValidate.
L'exemple ci-dessous prรฉsente un formulaire simple avec un seul champ de texte obligatoire. Un message d'erreur s'affiche si ce champ est vide.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Event Registration</title> <link rel="stylesheet" href="lib/bootstrap.css"> <script src="https://code.angularjs.org/1.8.3/angular.min.js"></script> <script src="lib/jcs-auto-validate.min.js"></script> </head> <body> <h1>Guru99 Event</h1> <div ng-app="DemoApp"> <form name="myForm" novalidate> <div class="form-group"> <label for="user">Topic Name:</label> <input class="form-control" type="text" id="user" name="user" ng-model="user" required> </div> <div class="form-group"> <input type="submit"> </div> </form> </div> <script> var app = angular.module('DemoApp', ['jcs-autoValidate']); </script> </body> </html>
โ ๏ธ Correction : L'original identifiait le contrรดle avec id="user" uniquement. jcs-autoValidate accรจde au contrรดle via le formulaire, donc un name L'attribut est obligatoire et le message n'apparaissait jamais sans lui. La version originale chargeait รฉgalement deux versions diffรฉrentes d'AngularJS, dont la 1.6.4. Google CDN en parallรจle de la version 1.6.9, et jamais liรฉ Bootstrap mรชme si l'exemple dรฉpend de son form-group et form-control classes pour positionner le texte d'erreur.
Remarque : jcs-autoValidate est un projet communautaire qui n'est plus activement maintenu. Il reste utilisable sur les applications AngularJS existantes, mais la fonction intรฉgrรฉe ngMessages L'approche prรฉsentรฉe prรฉcรฉdemment est le choix le plus sรปr pour toute nouveautรฉ.
Code Explication
- Le script ยซ jcs-auto-validate.js ยป, qui contient toutes les fonctionnalitรฉs d'auto-validation, est inclus.
- Chaque contrรดle et son รฉlรฉment div environnant sont placรฉs ร l'intรฉrieur d'une classe ยซ form-group ยป, dans laquelle le module injecte son message.
- Le contrรดle comporte ร la fois un identifiant et un
nameet Bootstrap fournit leform-controlstyle. - Le module ยซ jcs-autoValidate ยป est rรฉpertoriรฉ comme dรฉpendance du module AngularJS.
Sortie
Par dรฉfaut, le formulaire est rendu exactement comme il est รฉcrit.
L'envoi d'un formulaire vide affiche le message ยซ Ce champ est obligatoire ยป, gรฉnรฉrรฉ automatiquement par jcs-autoValidate. Une fois le formulaire validรฉ, la question qui se pose est celle de ce que l'utilisateur voit lors de son envoi.
Commentaires des utilisateurs avec les boutons Ladda
Les boutons ยซ Ladda ยป sont une structure construite sur la base de Javascรฉnario qui donne aux boutons un effet visuel lorsqu'on appuie dessus.
Si un bouton possรจde l'attribut ยซ ladda ยป et qu'on appuie dessus, un effet de rotation s'affiche. Diffรฉrents styles de donnรฉes sont disponibles pour des effets visuels supplรฉmentaires.
L'exemple ci-dessous prรฉsente un formulaire simple avec un bouton ยซ Envoyer ยป. Lorsqu'on appuie sur ce bouton, un effet de rotation apparaรฎt.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Event Registration</title> <link rel="stylesheet" href="lib/bootstrap.css"> <script src="https://code.angularjs.org/1.8.3/angular.min.js"></script> <script src="lib/angular-ladda.min.js"></script> </head> <body> <h1>Guru99 Event</h1> <div ng-app="DemoApp" ng-controller="DemoController"> <form name="myForm" novalidate ng-submit="submit()"> <button class="btn btn-primary" type="submit" ladda="submitting" name="sbutton" data-style="expand-right">Submit</button> </form> </div> <script> var app = angular.module('DemoApp', ['angular-ladda']); app.controller('DemoController', function($scope) { $scope.submitting = false; $scope.submit = function() { $scope.submitting = true; }; }); </script> </body> </html>
โ ๏ธ Correction : la charge d'origine angular-ladda.js et angular-ladda.min.js ensemble, ce qui enregistre le mรชme module deux fois, et a de nouveau importรฉ deux versions d'AngularJS. Il a รฉgalement listรฉ jcs-autoValidate Il s'agit d'une dรฉpendance que cet exemple n'utilise jamais. Une copie de chaque bibliothรจque est chargรฉe ici.
Code Explication
- L'รฉvรฉnement ng-soumettreLa directive appelle une fonction nommรฉe ยซ submit ยป, qui modifie l'attribut ladda du bouton.
- L'attribut ladda appartient au framework Ladda et c'est lui qui ajoute l'effet de rotation. Sa valeur est liรฉe ร
submittingvariable. - La propriรฉtรฉ data-style est un autre attribut Ladda qui permet de sรฉlectionner un effet visuel diffรฉrent.
- Le module ยซ angular-ladda ยป doit รชtre ajoutรฉ ร l'application AngularJS pour que le framework fonctionne.
- Le
submittingLa variable est initialisรฉe ร faux, le bouton dรฉmarre donc sans l'effet de rotation. - La fonction de soumission dรฉfinit
submittingLa valeur est dรฉfinie sur ยซ vrai ยป, ce qui applique l'effet. Dans une application rรฉelle, elle serait rรฉinitialisรฉe ร ยซ faux ยป une fois que le serveur aura rรฉpondu ; sinon, le bouton tournerait indรฉfiniment.
Sortie
Lors du premier affichage du formulaire, le bouton ยซ Soumettre ยป apparaรฎt sous sa forme simple.
Lorsque le bouton est enfoncรฉ, le submitting La variable est dรฉfinie sur vrai. Cette valeur atteint l'attribut ยซ ladda ยป du bouton, produisant l'effet de rotation.














