Els formularis reactius a Angular proporcionen una manera més robusta i escalable de gestionar formularis complexos. A diferència dels formularis basats en plantilles, els formularis reactius es defineixen i gestionen completament en el codi TypeScript, oferint un major control i flexibilitat.

Objectius d'aquest tema

  • Comprendre la diferència entre formularis basats en plantilles i formularis reactius.
  • Aprendre a crear formularis reactius.
  • Gestionar la validació de formularis reactius.
  • Manipular i reaccionar als canvis en els formularis reactius.

Diferències clau entre formularis basats en plantilles i formularis reactius

Característica Formularis basats en plantilles Formularis reactius
Definició del formulari HTML TypeScript
Validació Directament en la plantilla En el codi TypeScript
Escalabilitat Menys escalable Més escalable
Control sobre el formulari Menys control Més control
Sincronització amb el model Automàtica Manual

Creació d'un formulari reactiu

Passos per crear un formulari reactiu

  1. Importar els mòduls necessaris:

    import { ReactiveFormsModule } from '@angular/forms';
    
  2. Definir el formulari en el component TypeScript:

    import { Component } from '@angular/core';
    import { FormGroup, FormControl, Validators } from '@angular/forms';
    
    @Component({
      selector: 'app-reactive-form',
      templateUrl: './reactive-form.component.html'
    })
    export class ReactiveFormComponent {
      myForm: FormGroup;
    
      constructor() {
        this.myForm = new FormGroup({
          name: new FormControl('', [Validators.required, Validators.minLength(3)]),
          email: new FormControl('', [Validators.required, Validators.email]),
          password: new FormControl('', [Validators.required, Validators.minLength(6)])
        });
      }
    
      onSubmit() {
        console.log(this.myForm.value);
      }
    }
    
  3. Crear la plantilla HTML:

    <form [formGroup]="myForm" (ngSubmit)="onSubmit()">
      <label for="name">Name:</label>
      <input id="name" formControlName="name">
      <div *ngIf="myForm.get('name').invalid && myForm.get('name').touched">
        <small *ngIf="myForm.get('name').errors.required">Name is required.</small>
        <small *ngIf="myForm.get('name').errors.minlength">Name must be at least 3 characters long.</small>
      </div>
    
      <label for="email">Email:</label>
      <input id="email" formControlName="email">
      <div *ngIf="myForm.get('email').invalid && myForm.get('email').touched">
        <small *ngIf="myForm.get('email').errors.required">Email is required.</small>
        <small *ngIf="myForm.get('email').errors.email">Invalid email format.</small>
      </div>
    
      <label for="password">Password:</label>
      <input id="password" type="password" formControlName="password">
      <div *ngIf="myForm.get('password').invalid && myForm.get('password').touched">
        <small *ngIf="myForm.get('password').errors.required">Password is required.</small>
        <small *ngIf="myForm.get('password').errors.minlength">Password must be at least 6 characters long.</small>
      </div>
    
      <button type="submit" [disabled]="myForm.invalid">Submit</button>
    </form>
    

Explicació del codi

  • FormGroup: Representa el formulari en si mateix. És un contenidor per a un conjunt de controls de formulari.
  • FormControl: Representa un únic control de formulari, com un camp de text.
  • Validators: S'utilitzen per aplicar regles de validació als controls de formulari.

Validació de formularis reactius

Els formularis reactius permeten definir validacions de manera programàtica. A l'exemple anterior, hem utilitzat els validators required, minlength i email.

Manipulació i reacció als canvis

Els formularis reactius permeten reaccionar als canvis en els controls de formulari de manera senzilla:

this.myForm.get('name').valueChanges.subscribe(value => {
  console.log('Name changed:', value);
});

Exercici pràctic

Objectiu

Crear un formulari reactiu que inclogui camps per a nom, correu electrònic i contrasenya, amb validacions adequades.

Instruccions

  1. Crea un nou component anomenat UserFormComponent.
  2. Defineix un formulari reactiu amb els camps name, email i password.
  3. Afegeix validacions per a cada camp:
    • name: requerit, mínim 3 caràcters.
    • email: requerit, format de correu electrònic.
    • password: requerit, mínim 6 caràcters.
  4. Mostra missatges d'error adequats en la plantilla HTML.
  5. Afegeix un botó de submissió que només estigui habilitat si el formulari és vàlid.

Solució

user-form.component.ts:

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

@Component({
  selector: 'app-user-form',
  templateUrl: './user-form.component.html'
})
export class UserFormComponent {
  userForm: FormGroup;

  constructor() {
    this.userForm = new FormGroup({
      name: new FormControl('', [Validators.required, Validators.minLength(3)]),
      email: new FormControl('', [Validators.required, Validators.email]),
      password: new FormControl('', [Validators.required, Validators.minLength(6)])
    });
  }

  onSubmit() {
    console.log(this.userForm.value);
  }
}

user-form.component.html:

<form [formGroup]="userForm" (ngSubmit)="onSubmit()">
  <label for="name">Name:</label>
  <input id="name" formControlName="name">
  <div *ngIf="userForm.get('name').invalid && userForm.get('name').touched">
    <small *ngIf="userForm.get('name').errors.required">Name is required.</small>
    <small *ngIf="userForm.get('name').errors.minlength">Name must be at least 3 characters long.</small>
  </div>

  <label for="email">Email:</label>
  <input id="email" formControlName="email">
  <div *ngIf="userForm.get('email').invalid && userForm.get('email').touched">
    <small *ngIf="userForm.get('email').errors.required">Email is required.</small>
    <small *ngIf="userForm.get('email').errors.email">Invalid email format.</small>
  </div>

  <label for="password">Password:</label>
  <input id="password" type="password" formControlName="password">
  <div *ngIf="userForm.get('password').invalid && userForm.get('password').touched">
    <small *ngIf="userForm.get('password').errors.required">Password is required.</small>
    <small *ngIf="userForm.get('password').errors.minlength">Password must be at least 6 characters long.</small>
  </div>

  <button type="submit" [disabled]="userForm.invalid">Submit</button>
</form>

Resum

En aquest tema, hem après a crear formularis reactius a Angular, a definir validacions i a gestionar els canvis en els controls de formulari. Els formularis reactius ofereixen un major control i escalabilitat, fent-los ideals per a aplicacions complexes. Hem vist com definir un formulari reactiu en el codi TypeScript i com mostrar missatges d'error en la plantilla HTML. A més, hem practicat aquests conceptes amb un exercici pràctic.

Curs d'Angular

Mòdul 1: Introducció a Angular

Mòdul 2: Components d'Angular

Mòdul 3: Enllaç de dades i directives

Mòdul 4: Serveis i injecció de dependències

Mòdul 5: Enrutament i navegació

Mòdul 6: Formularis a Angular

Mòdul 7: Client HTTP i observables

Mòdul 8: Gestió d'estat

Mòdul 9: Proves a Angular

Mòdul 10: Conceptes avançats d'Angular

Mòdul 11: Desplegament i millors pràctiques

© Copyright 2024. Tots els drets reservats