6. ProductFormComponent (Formulario para añadir productos)

6.2. El ReactiveForms en el componente

En Angular existen dos tipos de formularios: los template-driven y los reactive forms.

En este proyecto usamos formularios reactivos porque son más potentes, más organizados y son el estándar profesional.

Además, para esta actividad necesitamos enviar datos al padre, validar, generar un producto nuevo y resetear el formulario.

Eso se hace mucho mejor con Reactive Forms.

Abrimos product-form.component.ts y añadimos:

import { Component, EventEmitter, Output } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';

En el decorador:

imports: [CommonModule, ReactiveFormsModule],

Reactive Forms viene del módulo ReactiveFormsModule, que debemos importar directamente en el componente porque es standalone

Creamos un FormGroup con los campos necesarios para un producto.

Usamos un @Output() llamado productoCreado para enviar los datos al componente padre. 

El método enviar() simplemente emite los datos del formulario y luego lo resetea.

Todavía no creamos el producto en el servicio porque eso lo veremos mas adelante junto con el UUID.

export class ProductFormComponent {

  @Output() productoCreado = new EventEmitter<any>();

  formulario = new FormGroup({
    name: new FormControl(''),
    description: new FormControl(''),
    price: new FormControl(0),
    category: new FormControl(''),
    image: new FormControl(''),
    active: new FormControl(true)
  });

  enviar() {
    this.productoCreado.emit(this.formulario.value);
    this.formulario.reset({
      name: '',
      description: '',
      price: 0,
      category: '',
      image: '',
      active: true
    });
  }
}

TS ANGULARts
export class ProductFormComponent {

  @Output() productoCreado = new EventEmitter();

  formulario = new FormGroup({
    name: new FormControl(''),
    description: new FormControl(''),
    price: new FormControl(class="tokts-number">0),
    category: new FormControl(''),
    image: new FormControl(''),
    active: new FormControl(true)
  });

  enviar() {
    this.productoCreado.emit(this.formulario.value);
    this.formulario.reset({
      name: '',
      description: '',
      price: class="tokts-number">0,
      category: '',
      image: '',
      active: true
    });
  }
}