Kevin Candia
Me siento un idiota haciendo mi formulario reactivo con @Inputs y @Outputs ajajajja que maravilloso!!!
¿Cómo conectar componentes personalizados a la API de Angular Reactive Forms?
La integración de componentes personalizados en formulaciones complejas, como formularios reactivos en Angular, es un desafío común para cualquier equipo de desarrollo. Muchas veces, los desarrolladores utilizan solo componentes nativos de HTML o elementos de bibliotecas externas como Angular Material, pero hoy aprenderás a crear y conectar tus propios componentes a la API de Angular Reactive Forms. Esto te abrirá las puertas para crear experiencias de usuario más personalizadas y eficientes.
¿Cómo crear un componente personalizado?
Primero, genera un nuevo componente en tu módulo compartido:
ng generate component Stepper
Este componente se añadirá automáticamente a tu módulo compartido, el cual centraliza los componentes que se usan en toda la aplicación. Asegúrate de exportar el nuevo componente para que esté disponible en otros módulos.
¿Cómo añadir funcionalidad básica al componente Stepper?
Ahora vamos a codificar la lógica básica de Stepper. El componente Stepper contará con dos botones para incrementar y decrementar un valor que se muestra en pantalla.
El código básico en HTML sería algo así:
<div> <button type="button" (click)="subtract()">-</button> <div>{{ currentValue }}</div> <button type="button" (click)="add()">+</button> </div>
Y en TypeScript, se manejará la lógica de incrementos:
export class StepperComponent { currentValue = 5; add() { this.currentValue++; } subtract() { this.currentValue--; } }
¿Cómo integrar Stepper con los formularios reactivos de Angular?
Para que este componente personalizado funcione con Reactive Forms, debemos implementar la interfaz ControlValueAccessor. Esta permite a Angular manejar la interacción entre los formularios y el componente. Aquí te mostramos cómo hacerlo:
import { Component, forwardRef } from '@angular/core'; import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; @Component({ selector: 'app-stepper', providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StepperComponent), multi: true }] }) export class StepperComponent implements ControlValueAccessor { currentValue = 0; writeValue(value: any): void { if (value !== undefined) { this.currentValue = value; } } registerOnChange(fn: any): void { this.onChange = fn; } registerOnTouched(fn: any): void { this.onTouched = fn; } ... }
onChange = (_: any) => {}; onTouched = () => {};
add y subtract para notificar los cambios.add() { this.currentValue++; this.onChange(this.currentValue); } subtract() { this.currentValue--; this.onChange(this.currentValue); }
Cómo incorporar Stepper en un formulario de Angular
Por último, añade el componente Stepper a tu formulario utilizando formControlName. Inicia el valor como desees en FormBuilder:
this.form = this.fb.group({ stock: [100, Validators.required] });
Y en el template HTML:
<form [formGroup]="form"> <app-stepper formControlName="stock"></app-stepper> </form>
Consideraciones y consejos prácticos
Este proceso hace que puedas desarrollar componentes de UI altamente personalizables y efectivos, lo cual es vital para crear aplicaciones escalables y atractivas. Ahora tienes el poder de construir una interfaz de usuario verdaderamente a medida, aprovechando completamente las capacidades de Angular. ¿Listo para el siguiente reto en tu desarrollo profesional? ¡Continúa explorando y creando!
Kevin Candia
Me siento un idiota haciendo mi formulario reactivo con @Inputs y @Outputs ajajajja que maravilloso!!!
Christian Michelle Torres Martínez
Genial la clase, pero tengo una duda, por decir si quisiera que al tener menos de 100 me deshabilite el botón de menos y no permita pasar de esa validación?
Rodolfo Rafael Ruiz Rodriguez
También funciona:
this.currentValue++; this.currentValue--;
Joel Campos
Esta potente esta función de angular
Elber Liebermen
Métodos de ControlValueAccessor
writeValue(obj: any): void { } registerOnChange(fn: any): void { } registerOnTouched(fn: any): void { } setDisabledState(isDisabled: boolean): void { }
Diego Lozano
writeValue(value: any): void {} registerOnChange(fn: any): void {} registerOnTouched(fn: any): void {} setDisabledState(isDisabled: boolean): void {}
Urbano Ballesteros
Esta genial la forma de integracion, pero ¿cómo le harían para obtener el estatus de del campo dentro del componente?
Nicolas Molina
ProfesorEs sencillo como es un CVA se comporta como otro FormControl así que con forms.get('input').value está bien.
Santiago Barrios Grijalba
la abreviación queadaría así:
this.currentValue += 1;
Carlos Macias
Muy valiosa esta información Control Value Accesor
Enrique Moreno
La sintaxis correcta para lo que querías hacer es : this.currentValue += 1;
Carlos Alejandro Hernández Mejía
Esa sería una forma de hacerlo, también pudo haber usado this.currentValue++; que era igual de válido. A veces hay formas más sencillas de hacer las cosas.
Emilio Nicolás Mendoza Patti
Acabo de hacer una implementacion de CVA en el trabajo y al fin logro entenderlo del todo y comprender bien el funcionamiento. Incluso noto que tambien puede ser util utilizarlo en conjunto a input y outputs pero no para manejar el valor si no para notificar los cambios de cada boton y poder realizar funcionalidad en cada caso
uRieL Martinez Bautista
Una chulada, lo integré con editor y asi puedo utilizar mi componente en varias vistas.
Diego Fernando Caviedes Camaho
Super clase. gracias
Jorge Martin Aguilar Hernández
Wow este curso está super bueno
Juan Carlos Pinzón
Esto definitivamente es lo que más me gusta de los formularios reativos y estos últimos es lo que más me gusta de Angular
Gustavo Restrepo
Buffffff parece magia, me pregunto si por ejemplo esto funcionaría con componentes externos que tengan ReactiveForms tambíen?
José Luis García Peceros
consulta, si yo en ves de asociarlo a formControlName y le pongo un ngmodel esto funcionaria igual ?
Santiago Barrios Grijalba
Sí, deberia