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.

  • ๐Ÿงฉ Attributs HTML5 : L'attribut ยซ required ยป et les types de saisie email, password et number permettent d'effectuer des vรฉrifications natives du navigateur sans script.
  • ๐Ÿ” Propriรฉtรฉs de l'ร‰tat : AngularJS expose les variables $dirty, $pristine, $valid et $invalid sur chaque contrรดle nommรฉ ร  l'intรฉrieur d'un formulaire nommรฉ.
  • ๐Ÿท๏ธ Exigence de dรฉnomination : Le formulaire et chaque contrรดle nรฉcessitent tous deux un attribut name, car l'รฉtat de validation est adressรฉ sous la forme nomDuFormulaire.nomDuContrรดle.
  • ๐Ÿšซ Supprimer les fenรชtres contextuelles natives : L'ajout de l'attribut novalidate au formulaire empรชche le navigateur d'intercepter la soumission afin qu'AngularJS puisse la gรฉrer.
  • ๐Ÿ’ฌ Affichage des messages : Le module ngMessages remplace les directives ng-show empilรฉes et affiche une erreur ร  la fois, par ordre de prioritรฉ.
  • โš™๏ธ Validation automatique : Le module jcs-autoValidate gรฉnรจre des messages d'erreur pour chaque contrรดle sans aucun balisage personnalisรฉ.
  • (I.e. Commentaires sur la soumission : Un bouton Ladda affiche un indicateur de chargement pendant le traitement d'une requรชte, signalant ainsi la progression ร  l'utilisateur.

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. &nbsp; Les entitรฉs ont รฉtรฉ supprimรฉes.

Code Explication

  1. Pour le type de saisie de texte, le required Cet attribut signifie que la zone de texte ne peut pas รชtre vide lors de la soumission du formulaire.
  2. 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รฉ.
  3. ร‰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.
  4. 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

  1. Le formulaire est nommรฉ ยซ myForm ยป. Ce nom est nรฉcessaire pour accรฉder ร  ses champs de validation.
  2. Le novalidate Cette propriรฉtรฉ empรชche le navigateur de valider le processus, permettant ainsi ร  AngularJS de s'en charger.
  3. 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รฉ.
  4. 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 ยป.
  5. Le bouton de soumission est dรฉsactivรฉ via ng-disabled lorsque le formulaire dans son ensemble est invalide.
  6. 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

  1. Le script ยซ jcs-auto-validate.js ยป, qui contient toutes les fonctionnalitรฉs d'auto-validation, est inclus.
  2. 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.
  3. Le contrรดle comporte ร  la fois un identifiant et un name et Bootstrap fournit le form-control style.
  4. 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

  1. L'รฉvรฉnement ng-soumettreLa directive appelle une fonction nommรฉe ยซ submit ยป, qui modifie l'attribut ladda du bouton.
  2. L'attribut ladda appartient au framework Ladda et c'est lui qui ajoute l'effet de rotation. Sa valeur est liรฉe ร  submitting variable.
  3. La propriรฉtรฉ data-style est un autre attribut Ladda qui permet de sรฉlectionner un effet visuel diffรฉrent.
  4. Le module ยซ angular-ladda ยป doit รชtre ajoutรฉ ร  l'application AngularJS pour que le framework fonctionne.
  5. Le submitting La variable est initialisรฉe ร  faux, le bouton dรฉmarre donc sans l'effet de rotation.
  6. La fonction de soumission dรฉfinit submitting La 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.

FAQ

La variable `$dirty` passe ร  `true` lorsque la valeur change. La variable `$touched` passe ร  `true` lorsque le champ perd le focus. Utilisez `$touched` pour retarder l'affichage d'une erreur jusqu'ร  ce que l'utilisateur ait continuรฉ, ce qui est moins intrusif.ping.

Ajoutez la directive ng-pattern avec une expression rรฉguliรจre, par exemple ng-pattern="/^[0-9]{6}$/". L'erreur apparaรฎt alors sous la forme $error.pattern, que ngMessages peut signaler comme n'importe quelle contrainte intรฉgrรฉe.

Oui. Les outils d'IA analysent le balisage et gรฉnรจrent les blocs required, ng-pattern et ngMessages correspondants. Vรฉrifiez toujours les expressions rรฉguliรจres, car les modรจles d'adresse e-mail et de numรฉro de tรฉlรฉphone gรฉnรฉrรฉs rejettent souvent des entrรฉes valides.

Les assistants IA vรฉrifient rapidement les trois causes habituelles : un attribut name manquant sur le formulaire ou le contrรดle, un ng-model manquant et lโ€™absence de novalidate, ce qui fait que le navigateur intercepte dโ€™abord la soumission.

Non. Cela amรฉliore l'expรฉrience et rรฉduit les allers-retours, mais n'importe qui peut contourner cette limitation avec les outils de dรฉveloppement. Toute rรจgle appliquรฉe dans le navigateur doit รฉgalement l'รชtre sur le serveur.

Rรฉsumez cet article avec :