Mediante NG_VALUE_ACCESSOR y NG_VALIDATORS también podemos crear formularios reactivos reutilizables y anidados.
Dejo un artículo bastante interesante:
https://coryrylan.com/blog/building-reusable-forms-in-angular
Conoce la importancia de los formularios para tu sitio web
Versiones de Angular Forms
¿Por qué aprender Angular Forms?
Presentación del proyecto: tour por los formularios de Platzi Store
Novedades de Angular 10: cómo migrar proyectos de Angular 8 o 9 a la versión 10
Primeros pasos con Angular Forms
Template Forms vs. Reactive Forms
Dominando el FormControl y sus estados
Cómo usar inputs de texto y la importancia del type
Manejo y binding de selects y selects múltiples
Manejo y binding de inputs radio y checkbox
Aplica validaciones a un FormControl
Integración y validaciones con CSS para mostrar errores
Descubre todas las validaciones de Angular Forms
Usando FormGroup para agrupar multiples campos
Reactive Forms con FormBuilder
Los 11 validadores de Angular (y expresiones regulares)
Manejando múltiples FormsGroups
Usando componentes de Angular Material
Errores comunes de usabilidad en formularios
Validaciones personalizadas: mejorando nuestro formulario de registro
Implemeta validaciones avanzadas en PlatziStore
Cómo hacer validaciones grupales en Angular Forms
Validaciones condicionadas y reactividad a variaciones en la UI
Proyecto: formulario para crear categorías de productos
Proyecto: conectando nuestro formulario y la API
Proyecto: subir imágenes a Firebase Storage
Validaciones asincrónicas
PatchValue: crear vs. editar
Proyecto: creando el método de editar categorías
Construye formularios dinámicos conectando una API
Smart vs. dumb components: un patrón para dividir responsabilidades
Implementando smart y dumb components en PlatziStore
Proyecto: mejorando nuestro formulario de productos
Select dinámico: carga opciones desde una API
Select dinámico: trabajando con objetos
¿Cómo crear campos on demand? Forms dinámicos con FormArray
Estrategias avanzadas y optimización de formularios
Crea tu propia librería de componentes con CVA o Control Value Accesor
Crea un buscador de gifs usando la API de Giphy
Optimiza un input de búsquedas con RxJS y debounce
Examina la accesibilidad de tus formularios
Siguientes pasos en tu carrera de desarrollo web profesional con Angular
You don't have access to this class
Keep learning! Join and start boosting your career
Integrating custom components into complex formulations, such as Angular Reactive Forms, is a common challenge for any development team. Many times, developers use only native HTML components or elements from external libraries like Angular Material, but today you will learn how to create and connect your own components to the Angular Reactive Forms API. This will open doors for you to create more personalized and efficient user experiences.
First, generate a new component in your shared module:
ng generate component Stepper
This component will be automatically added to your shared module, which centralizes the components used throughout the application. Be sure to export the new component so that it is available in other modules.
Now let's code the basic Stepper logic. The Stepper component will have two buttons to increment and decrement a value displayed on the screen.
The basic HTML code would look something like this:
<div> <button type="button" (click)="subtract()">-</button> <div>{{ currentValue }}</div> <button type="button" (click)="add()">+</button></div></div>.
And in TypeScript, the increment logic will be handled:
export class StepperComponent { currentValue = 5;
add() { this.currentValue++; }
subtract() { this.currentValue--; } }}
For this custom component to work with Reactive Forms, we must implement the ControlValueAccessor
interface. This allows Angular to handle the interaction between the forms and the component. Here's how to do it:
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
and subtract
methods to notify changes.add() { this.currentValue++; this.onChange(this.currentValue);}
subtract() { this.currentValue--; this.onChange(this.currentValue);}
Finally, add the Stepper component to your form using formControlName
. Initialize the value as you wish in FormBuilder
:
this.form = this.fb.group({ stock: [100, Validators.required]});
And in the HTML template:
<form [formGroup]="form"> <app-stepper formControlName="stock"></app-stepper></form>.
This process allows you to develop highly customizable and effective UI components, which is vital for creating scalable and engaging applications. Now you have the power to build a truly custom UI, taking full advantage of Angular's capabilities. Ready for the next challenge in your development career? Keep exploring and creating!
Contributions 17
Questions 2
Mediante NG_VALUE_ACCESSOR y NG_VALIDATORS también podemos crear formularios reactivos reutilizables y anidados.
Dejo un artículo bastante interesante:
https://coryrylan.com/blog/building-reusable-forms-in-angular
Es una caja negra el cómo se integra con Reactive Forms. Nunca sabremos cómo funciona, pero es una maravilla!
Me siento un idiota haciendo mi formulario reactivo con @Inputs y @Outputs ajajajja que maravilloso!!!
También funciona:
this.currentValue++;
this.currentValue–;
Esta potente esta función de angular
Métodos de ControlValueAccessor
writeValue(obj: any): void {
}
registerOnChange(fn: any): void {
}
registerOnTouched(fn: any): void {
}
setDisabledState(isDisabled: boolean): void {
}
la abreviación queadaría así:
this.currentValue += 1;
Muy valiosa esta información Control Value Accesor
La sintaxis correcta para lo que querías hacer es :
this.currentValue += 1;
writeValue(value: any): void {}
registerOnChange(fn: any): void {}
registerOnTouched(fn: any): void {}
setDisabledState(isDisabled: boolean): void {}
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
Una chulada, lo integré con editor y asi puedo utilizar mi componente en varias vistas.
Super clase. gracias
Wow este curso está super bueno
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
Buffffff parece magia, me pregunto si por ejemplo esto funcionaría con componentes externos que tengan ReactiveForms tambíen?
consulta, si yo en ves de asociarlo a formControlName y le pongo un ngmodel esto funcionaria igual ?
Want to see more contributions, questions and answers from the community?