Guide sur l'utilisation de ReactiveFormsModule dans Angular

high54

Julien Bertacco

Posted on May 1, 2023

Guide sur l'utilisation de ReactiveFormsModule dans Angular

ReactiveFormsModule est un module de formulaires réactifs d'Angular qui offre une approche plus flexible et robuste pour gérer les formulaires dans les applications Angular. Dans cet article, nous allons explorer en détail comment utiliser ReactiveFormsModule et fournir des exemples de code pour illustrer différentes fonctionnalités. Les formulaires réactifs utilisent un modèle basé sur les observables et sont idéaux pour travailler avec des formulaires complexes et dynamiques.

Table des matières

  1. Prérequis
  2. Configuration de ReactiveFormsModule
  3. Création d'un formulaire réactif simple
  4. Validation du formulaire
  5. Validation asynchrone
  6. Affichage des messages d'erreur
  7. Groupes de formulaires imbriqués
  8. Arrays de formulaires
  9. Valeurs et statuts des observables
  10. Soumission du formulaire
  11. Utilisation de formBuilder
  12. Bonnes pratiques
  13. Conclusion

1. Prérequis

Assurez-vous d'avoir installé la version la plus récente d'Angular CLI et de Node.js. Vous devriez également être familiarisé avec les bases d'Angular, y compris les composants, les directives et les services.

2. Configuration de ReactiveFormsModule

Pour utiliser ReactiveFormsModule, commencez par importer ReactiveFormsModuledans le module de votre application :

import { ReactiveFormsModule } from '@angular/forms';
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';

@NgModule({
  declarations: [AppComponent],
  imports: [BrowserModule, ReactiveFormsModule],
  providers: [],
  bootstrap: [AppComponent],
})
export class AppModule {}

Enter fullscreen mode Exit fullscreen mode

3. Création d'un formulaire réactif simple

Pour créer un formulaire réactif, importez FormControlet FormGroupdans votre composant et créez une instance de FormGroup:

import { Component } from '@angular/core';
import { FormControl, FormGroup } from '@angular/forms';

@Component({
  selector: 'app-root',
  template: `
    <form [formGroup]="myForm">
      <label>
        Name:
        <input type="text" formControlName="name" />
      </label>
      <label>
        Email:
        <input type="email" formControlName="email" />
      </label>
    </form>
  `,
})
export class AppComponent {
  myForm = new FormGroup({
    name: new FormControl(''),
    email: new FormControl(''),
  });
}

Enter fullscreen mode Exit fullscreen mode

4. Validation du formulaire

Pour ajouter des validations, importez les validateurs appropriés et passez-les en argument lors de l'instanciation des FormControl:

import { Validators } from '@angular/forms';

myForm = new FormGroup({
  name: new FormControl('', Validators.required),
  email: new FormControl('', [Validators.required, Validators.email]),
});

Enter fullscreen mode Exit fullscreen mode

Angular offre plusieurs validateurs intégrés pour gérer des cas d'utilisation courants. Voici une liste des validateurs les plus couramment utilisés, leur fonctionnement et des exemples d'utilisation :

  • Validators.required : vérifie que le champ n'est pas vide et qu'une valeur a été saisie. Si le champ est vide, une erreur required est renvoyée.

Exemple d'utilisation :

name: new FormControl('', Validators.required)
Enter fullscreen mode Exit fullscreen mode
  • Validators.minLength : vérifie que la longueur de la valeur saisie est supérieure ou égale à une longueur minimale spécifiée. Si la longueur est inférieure, une erreur minlength est renvoyée.

Exemple d'utilisation :

password: new FormControl('', Validators.minLength(8))
Enter fullscreen mode Exit fullscreen mode
  • Validators.maxLength : vérifie que la longueur de la valeur saisie est inférieure ou égale à une longueur maximale spécifiée. Si la longueur est supérieure, une erreur maxlength est renvoyée.

Exemple d'utilisation :

password: new FormControl('', Validators.maxLength(32))
Enter fullscreen mode Exit fullscreen mode
  • Validators.email : vérifie que la valeur saisie est un e-mail valide, en fonction d'une expression régulière simplifiée. Si l'e-mail est invalide, une erreur email est renvoyée.

Exemple d'utilisation :

email: new FormControl('', Validators.email)
Enter fullscreen mode Exit fullscreen mode
  • Validators.pattern : vérifie que la valeur saisie correspond à une expression régulière spécifiée. Si la valeur ne correspond pas, une erreur pattern est renvoyée.

Exemple d'utilisation :

username: new FormControl('', Validators.pattern('^[a-z0-9_-]{8,32}$'))
Enter fullscreen mode Exit fullscreen mode
  • Validators.min : vérifie que la valeur numérique saisie est supérieure ou égale à un nombre minimum spécifié. Si la valeur est inférieure, une erreur min est renvoyée.

Exemple d'utilisation :

age: new FormControl('', Validators.min(18))
Enter fullscreen mode Exit fullscreen mode
  • Validators.max : vérifie que la valeur numérique saisie est inférieure ou égale à un nombre maximum spécifié. Si la valeur est supérieure, une erreur max est renvoyée.

Exemple d'utilisation :

age: new FormControl('', Validators.max(120))
Enter fullscreen mode Exit fullscreen mode

Les validateurs intégrés peuvent être utilisés seuls ou combinés en utilisant un tableau pour appliquer plusieurs validateurs sur un seul contrôle de formulaire :

password: new FormControl('', [
  Validators.required,
  Validators.minLength(8),
  Validators.maxLength(32),
]),
Enter fullscreen mode Exit fullscreen mode

En maîtrisant ces validateurs intégrés et en comprenant comment les appliquer sur vos contrôles de formulaire, vous pouvez garantir la qualité des données saisies par les utilisateurs et améliorer l'expérience utilisateur de vos applications Angular.

5. Validation asynchrone

Les validateurs asynchrones sont utiles lorsque vous devez effectuer des opérations de validation qui nécessitent une communication avec un serveur, comme vérifier si un nom d'utilisateur est disponible. Les validateurs asynchrones sont similaires aux validateurs personnalisés, mais retournent un Promise ou un Observable.

Par exemple, pour créer un validateur asynchrone qui vérifie si un nom d'utilisateur est disponible :

import { AbstractControl, ValidationErrors } from '@angular/forms';

function usernameAvailable(control: AbstractControl): Promise<ValidationErrors | null> {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (control.value === 'takenUsername') {
        resolve({ usernameAvailable: false });
      } else {
        resolve(null);
      }
    }, 2000);
  });
}

myForm = new FormGroup({
  username: new FormControl('', Validators.required, usernameAvailable),
});

Enter fullscreen mode Exit fullscreen mode

6. Affichage des messages d'erreur

Pour afficher des messages d'erreur, utilisez des éléments conditionnels dans votre modèle :

<form [formGroup]="myForm">
  <!-- ... -->
  <label>
    Email:
    <input type="email" formControlName="email" />
  </label>
  <div *ngIf="myForm.get('email').errors?.required">Email is required</div>
  <div *ngIf="myForm.get('email').errors?.email">Invalid email</div>
</form>

Enter fullscreen mode Exit fullscreen mode

7. Groupes de formulaires imbriqués

Pour les groupes de formulaires imbriqués, créez des instances de FormGroup supplémentaires et ajoutez-les à votre formulaire principal :

myForm = new FormGroup({
  name: new FormControl('', Validators.required),
  email: new FormControl('', [Validators.required, Validators.email]),
  address: new FormGroup({
    street: new FormControl(''),
    city: new FormControl(''),
    zip: new FormControl(''),
  }),
});

Enter fullscreen mode Exit fullscreen mode

Mettez à jour votre modèle pour refléter les groupes de formulaires imbriqués :

<form [formGroup]="myForm">
  <!-- ... -->
  <div formGroupName="address">
    <label>
      Street:
      <input type="text" formControlName="street" />
    </label>
    <label>
      City:
      <input type="text" formControlName="city" />
    </label>
    <label>
      Zip:
      <input type="text" formControlName="zip" />
    </label>
  </div>
</form>

Enter fullscreen mode Exit fullscreen mode

8. Arrays de formulaires

Pour gérer des tableaux de formulaires, importez FormArrayet ajoutez-le à votre formulaire :

import { FormArray } from '@angular/forms';

myForm = new FormGroup({
  // ...
  aliases: new FormArray([new FormControl('')]),
});

// Méthode pour ajouter un nouvel alias
addAlias(): void {
  (this.myForm.get('aliases') as FormArray).push(new FormControl(''));
}

Enter fullscreen mode Exit fullscreen mode

Mettez à jour votre modèle pour refléter les arrays de formulaires :

<form [formGroup]="myForm">
  <!-- ... -->
  <div formArrayName="aliases">
    <div *ngFor="let alias of myForm.get('aliases').controls; let i = index">
      <label>
        Alias {{ i + 1 }}:
        <input type="text" [formControlName]="i" />
      </label>
    </div>
  </div>
  <button (click)="addAlias()">Add Alias</button>
</form>

Enter fullscreen mode Exit fullscreen mode

9. Valeurs et statuts des observables

Pour suivre les changements de valeurs et de statuts, utilisez les observables valueChangeset statusChanges:

ngOnInit(): void {
  this.myForm.valueChanges.subscribe(val => {
    console.log('Form value changed:', val);
  });

  this.myForm.statusChanges.subscribe(status => {
    console.log('Form status changed:', status);
  });
}

Enter fullscreen mode Exit fullscreen mode

10. Soumission du formulaire

Pour soumettre le formulaire, créez une méthode dans votre composant et liez-la à l'événement ngSubmit:

onSubmit(): void {
  console.log('Form submitted:', this.myForm.value);
}

Enter fullscreen mode Exit fullscreen mode

Mettez à jour votre modèle pour ajouter un bouton de soumission et lier l'événement ngSubmit:

<form [formGroup]="myForm" (ngSubmit)="onSubmit()">
  <!-- ... -->
  <button type="submit" [disabled]="myForm.invalid">Submit</button>
</form>

Enter fullscreen mode Exit fullscreen mode

Vous devriez maintenant être en mesure de créer des formulaires réactifs complexes et de les gérer efficacement dans vos applications Angular. N'hésitez pas à explorer davantage les fonctionnalités offertes par ReactiveFormsModule pour tirer le meilleur parti des formulaires réactifs.

11. Utilisation de FormBuilder

FormBuilder est un service inclus dans ReactiveFormsModule qui simplifie la création de formulaires réactifs en utilisant une syntaxe plus concise. Il est particulièrement utile lorsque vous travaillez avec des formulaires complexes, des groupes imbriqués ou des tableaux de formulaires.

Voici les étapes pour utiliser FormBuilder :

  • Importez FormBuilder dans votre composant :
import { FormBuilder } from '@angular/forms';
Enter fullscreen mode Exit fullscreen mode
  • Injectez FormBuilder dans le constructeur du composant :
constructor(private fb: FormBuilder) {}
Enter fullscreen mode Exit fullscreen mode
  • Utilisez FormBuilder pour créer des instances de FormGroup, FormControl, et FormArray :

Voici comment utiliser FormBuilder pour créer un formulaire réactif similaire à celui décrit précédemment :

myForm = this.fb.group({
  name: ['', Validators.required],
  email: ['', [Validators.required, Validators.email]],
  address: this.fb.group({
    street: [''],
    city: [''],
    zip: [''],
  }),
  aliases: this.fb.array([this.fb.control('')]),
});

Enter fullscreen mode Exit fullscreen mode

Comme vous pouvez le constater, FormBuilder simplifie la création des instances de FormGroup, FormControl et FormArray avec des méthodes telles que group(), array() et control().

  • Ajoutez des éléments aux FormArray en utilisant FormBuilder :

Si vous souhaitez ajouter des éléments à un FormArray, vous pouvez utiliser this.fb.control() pour créer un nouveau contrôle :

addAlias(): void {
  (this.myForm.get('aliases') as FormArray).push(this.fb.control(''));
}

Enter fullscreen mode Exit fullscreen mode
  • Utilisez FormBuilder pour créer des validateurs personnalisés :

Si vous devez créer des validateurs personnalisés pour vos contrôles de formulaire, vous pouvez également utiliser FormBuilder pour cela. Par exemple, si vous voulez créer un validateur qui vérifie si la valeur d'un champ est égale à une chaîne spécifique, vous pouvez procéder comme suit :

import { AbstractControl, ValidationErrors } from '@angular/forms';

function matchValue(value: string) {
  return (control: AbstractControl): ValidationErrors | null => {
    return control.value === value ? null : { matchValue: true };
  };
}

myForm = this.fb.group({
  secret: ['', [Validators.required, matchValue('secret-value')]],
});

Enter fullscreen mode Exit fullscreen mode

En résumé, FormBuilder est un outil puissant qui simplifie la création et la gestion des formulaires réactifs dans Angular. En utilisant FormBuilder, vous pouvez rendre votre code plus lisible et maintenable tout en profitant des fonctionnalités avancées des formulaires réactifs.

12. Bonnes pratiques

Pour tirer le meilleur parti des ReactiveForms dans Angular, il est important de suivre certaines bonnes pratiques pour assurer la lisibilité, la maintenabilité et la performance de vos applications. Voici quelques conseils pour travailler efficacement avec les ReactiveForms :

  • Utiliser FormBuilder

L'utilisation de FormBuilder permet de simplifier la création de FormGroup, FormControl et FormArray avec une syntaxe plus concise et lisible. Cela peut améliorer la maintenabilité de votre code en réduisant la complexité et en rendant les intentions plus claires.

  • Gérer les erreurs de validation

Prenez le temps de gérer correctement les erreurs de validation, en affichant des messages d'erreur clairs et spécifiques pour chaque erreur. Utilisez les directives et les expressions conditionnelles d'Angular pour afficher les messages d'erreur uniquement lorsque le contrôle de formulaire est invalide et a été touché.

  • Utiliser des validateurs personnalisés et asynchrones

Si les validateurs intégrés ne répondent pas à vos besoins, n'hésitez pas à créer des validateurs personnalisés ou asynchrones pour des cas d'utilisation spécifiques. Assurez-vous de bien comprendre le cycle de vie des formulaires et les différences entre les validateurs synchrones et asynchrones pour une implémentation correcte.

  • Structurer les groupes de formulaires et les arrays de formulaires

Dans les formulaires complexes, utilisez des groupes de formulaires imbriqués et des arrays de formulaires pour organiser et structurer vos données. Cela améliorera la lisibilité de votre code et facilitera la maintenance et la mise à jour de vos formulaires.

  • Utiliser l'opérateur de décomposition (spread operator)

L'opérateur de décomposition peut simplifier le traitement des données de formulaire, en facilitant la fusion d'objets, l'ajout d'éléments à un tableau, ou la combinaison de groupes de formulaires imbriqués. Utilisez l'opérateur de décomposition pour rendre votre code plus lisible et maintenable.

  • Désactiver le bouton de soumission lorsque le formulaire est invalide

Pour éviter que les utilisateurs ne soumettent accidentellement des formulaires avec des données invalides, désactivez le bouton de soumission lorsque le formulaire est invalide. Utilisez l'attribut [disabled] pour désactiver le bouton en fonction du statut de validation du formulaire.

  • Détacher les observables inutilisés

Si vous utilisez des observables tels que valueChangeset statusChangespour suivre les modifications des valeurs et des statuts des formulaires, assurez-vous de vous désabonner de ces observables lorsque le composant est détruit pour éviter les fuites de mémoire. Utilisez le pattern takeUntil ou la méthode unsubscribe() pour gérer correctement la désinscription.

En suivant ces bonnes pratiques pour les ReactiveForms, vous pourrez créer des applications Angular robustes et maintenables, avec des formulaires réactifs bien structurés et efficaces.

13. Conclusion

Dans cet article, nous avons exploré l'utilisation de ReactiveFormsModule et de FormBuilder pour créer et gérer des formulaires réactifs dans Angular. Les formulaires réactifs sont une approche flexible et robuste pour gérer des formulaires complexes et dynamiques dans vos applications Angular. Grâce à ReactiveFormsModule et FormBuilder, vous pouvez créer des instances de FormGroup, FormControl et FormArray, ajouter des validations, afficher des messages d'erreur, gérer des groupes de formulaires imbriqués et des arrays de formulaires, et suivre les changements de valeurs et de statuts à l'aide d'observables.

En maîtrisant les concepts et les techniques présentés dans cet article, vous serez mieux équipé pour créer des formulaires réactifs efficaces et maintenables pour vos applications Angular. N'hésitez pas à explorer davantage les fonctionnalités offertes par ReactiveFormsModule et FormBuilder pour tirer le meilleur parti des formulaires réactifs et améliorer encore plus l'expérience utilisateur de vos applications.

💖 💪 🙅 🚩
high54
Julien Bertacco

Posted on May 1, 2023

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related