Introducción

Los formularios basados en plantillas en Angular permiten crear y gestionar formularios utilizando directivas y plantillas HTML. Este enfoque es ideal para formularios simples y medianos, donde la lógica del formulario se puede manejar principalmente en la plantilla.

Conceptos Clave

  1. Directiva ngModel: Vincula los datos del formulario con el modelo de datos en el componente.
  2. Directiva ngForm: Proporciona un contenedor para el formulario y gestiona su estado.
  3. Validaciones: Uso de atributos HTML y directivas de Angular para validar los campos del formulario.
  4. Manejo de Errores: Mostrar mensajes de error basados en el estado de validación de los campos.

Configuración Inicial

Paso 1: Crear un Componente

Primero, crea un nuevo componente para el formulario:

ng generate component template-driven-form

Paso 2: Importar FormsModule

Asegúrate de importar FormsModule en el módulo correspondiente (app.module.ts):

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

@NgModule({
  declarations: [
    // otros componentes
    TemplateDrivenFormComponent
  ],
  imports: [
    // otros módulos
    FormsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

Creación del Formulario

Paso 3: Definir el Modelo de Datos

En el componente, define el modelo de datos que representará el formulario:

import { Component } from '@angular/core';

@Component({
  selector: 'app-template-driven-form',
  templateUrl: './template-driven-form.component.html',
  styleUrls: ['./template-driven-form.component.css']
})
export class TemplateDrivenFormComponent {
  user = {
    name: '',
    email: '',
    password: ''
  };

  onSubmit() {
    console.log('Formulario enviado', this.user);
  }
}

Paso 4: Crear la Plantilla del Formulario

En el archivo de plantilla (template-driven-form.component.html), crea el formulario utilizando las directivas ngForm y ngModel:

<form #userForm="ngForm" (ngSubmit)="onSubmit()">
  <div>
    <label for="name">Nombre:</label>
    <input type="text" id="name" name="name" [(ngModel)]="user.name" required>
  </div>
  <div>
    <label for="email">Email:</label>
    <input type="email" id="email" name="email" [(ngModel)]="user.email" required email>
  </div>
  <div>
    <label for="password">Contraseña:</label>
    <input type="password" id="password" name="password" [(ngModel)]="user.password" required minlength="6">
  </div>
  <button type="submit" [disabled]="userForm.invalid">Enviar</button>
</form>

Paso 5: Validaciones y Manejo de Errores

Añade validaciones y muestra mensajes de error en la plantilla:

<form #userForm="ngForm" (ngSubmit)="onSubmit()">
  <div>
    <label for="name">Nombre:</label>
    <input type="text" id="name" name="name" [(ngModel)]="user.name" required>
    <div *ngIf="userForm.submitted && userForm.controls.name?.invalid">
      <small *ngIf="userForm.controls.name?.errors?.required">El nombre es obligatorio.</small>
    </div>
  </div>
  <div>
    <label for="email">Email:</label>
    <input type="email" id="email" name="email" [(ngModel)]="user.email" required email>
    <div *ngIf="userForm.submitted && userForm.controls.email?.invalid">
      <small *ngIf="userForm.controls.email?.errors?.required">El email es obligatorio.</small>
      <small *ngIf="userForm.controls.email?.errors?.email">El email no es válido.</small>
    </div>
  </div>
  <div>
    <label for="password">Contraseña:</label>
    <input type="password" id="password" name="password" [(ngModel)]="user.password" required minlength="6">
    <div *ngIf="userForm.submitted && userForm.controls.password?.invalid">
      <small *ngIf="userForm.controls.password?.errors?.required">La contraseña es obligatoria.</small>
      <small *ngIf="userForm.controls.password?.errors?.minlength">La contraseña debe tener al menos 6 caracteres.</small>
    </div>
  </div>
  <button type="submit" [disabled]="userForm.invalid">Enviar</button>
</form>

Ejercicio Práctico

Ejercicio 1: Añadir un Campo de Confirmación de Contraseña

  1. Añade un campo de confirmación de contraseña al formulario.
  2. Asegúrate de que la contraseña y la confirmación de la contraseña coincidan.
  3. Muestra un mensaje de error si las contraseñas no coinciden.

Solución

Paso 1: Actualizar el Modelo de Datos

user = {
  name: '',
  email: '',
  password: '',
  confirmPassword: ''
};

Paso 2: Actualizar la Plantilla del Formulario

<form #userForm="ngForm" (ngSubmit)="onSubmit()">
  <!-- Otros campos -->
  <div>
    <label for="confirmPassword">Confirmar Contraseña:</label>
    <input type="password" id="confirmPassword" name="confirmPassword" [(ngModel)]="user.confirmPassword" required>
    <div *ngIf="userForm.submitted && userForm.controls.confirmPassword?.invalid">
      <small *ngIf="userForm.controls.confirmPassword?.errors?.required">La confirmación de la contraseña es obligatoria.</small>
      <small *ngIf="user.password !== user.confirmPassword">Las contraseñas no coinciden.</small>
    </div>
  </div>
  <button type="submit" [disabled]="userForm.invalid || user.password !== user.confirmPassword">Enviar</button>
</form>

Conclusión

En esta sección, hemos aprendido a crear formularios basados en plantillas en Angular, utilizando directivas como ngModel y ngForm. También hemos visto cómo añadir validaciones y manejar errores en la plantilla. Los formularios basados en plantillas son una forma poderosa y sencilla de gestionar formularios en Angular, especialmente para aplicaciones pequeñas y medianas.

En el próximo tema, exploraremos los formularios reactivos, que ofrecen un mayor control y flexibilidad para formularios más complejos.

Curso de Angular 2+

Módulo 1: Introducción a Angular

Módulo 2: Conceptos Básicos de TypeScript

Módulo 3: Componentes y Plantillas

Módulo 4: Directivas y Pipes

Módulo 5: Servicios e Inyección de Dependencias

Módulo 6: Enrutamiento y Navegación

Módulo 7: Formularios en Angular

Módulo 8: Cliente HTTP y Observables

Módulo 9: Gestión de Estado

Módulo 10: Pruebas en Angular

Módulo 11: Temas Avanzados

Módulo 12: Despliegue y Mejores Prácticas

© Copyright 2024. Todos los derechos reservados