El método ngOnChange es una herramienta poderosa en el desarrollo con Angular que nos permite detectar y reaccionar a cambios en los inputs de un componente. Este método resulta crucial cuando se necesita implementar lógica de negocio en respuesta a cambios específicos de los valores de los inputs. Al utilizar ngOnChange, podemos identificar qué inputs han cambiado y actuar en consecuencia, garantizando un flujo de trabajo más eficiente y dinámico.
¿Cómo funciona ngOnChange en un componente?
El ngOnChange se ejecuta cada vez que hay un cambio en los valores de los inputs de un componente. Su principal ventaja es que se activa en tiempo real, a diferencia de otros métodos como ngOnInit, el cual se ejecuta solamente una vez después de la asignación inicial de los inputs.
Listado de cambios detectados
Identifica los cambios específicamente por el input que ha cambiado.
Nos permite implementar lógica específica para cada input detectado.
Por ejemplo, si tenemos un input llamado duration, podemos programar que se ejecute una función específica cada vez que este input cambie su valor.
Implementación de lógica de negocio
La utilidad de ngOnChange va más allá de solo detectar cambios. Permite, por ejemplo, realizar cálculos o mostrar mensajes al usuario en función de los cambios detectados. Si queremos que al cambiar duration, se ejecute cierta lógica, debemos verificar si dentro de los cambios está presente dicho input.
ngOnChanges(changes:SimpleChanges){if(changes['duration']){this.doSomething();}}doSomething(){// Lógica de negocio que se ejecuta al cambiar durationconsole.log('Duration ha cambiado');}
Validaciones adicionales
Para una mayor precisión, podemos agregar validaciones adicionales, por ejemplo, asegurarnos de que el nuevo valor es diferente al anterior antes de ejecutar cualquier lógica.
Al utilizar ngOnChange, es fundamental asegurar que el uso de los inputs y las evaluaciones de los cambios son óptimas para evitar la ejecución innecesaria de lógica cuando no es preciso. Aquí se presentan algunos consejos para optimizar su uso:
Detección exclusiva de cambios relevantes
Asegúrate de evaluar solo los cambios necesarios.
Combina ngOnChange con estructuras de control para validar cambios específicos.
Evaluación de cambios de valores
Compara siempre el valor actual con el valor anterior para evitar ejecuciones redundantes.
Implementa lógica para evaluar no solo si el valor cambió, sino si el cambio es significativo para la lógica de negocio.
Ejecución de lógica asíncrona
El ngOnChange también es compatible con la ejecución de tareas asíncronas, lo que permite realizar solicitudes API o cualquier otro proceso que requiera asincronía de manera eficiente.
La implementación adecuada de ngOnChange optimiza el rendimiento y la funcionalidad de los componentes en Angular, permitiendo un manejo más efectivo de los datos de entrada y las respuestas del usuario.
Por si les llega a aparecer algún error cuando tratan decolocar la variable duration dentro del ngOnChanges. Verifiquen que el tipo del parametro 'changes' sea SimpleChanges y no SimpleChange. De lo contrario, saldrá un error que dice la cariable changes no puede estar indexada con la variable duration.
Que buen servicio. :)
Muy bien, gracias.
Recomiendo usar hasOwnProperty:
ngOnChanges(changes: SimpleChanges): void {
if (changes.hasOwnProperty('duration')) {
console.log('duration')
}
}
Si les sale un error cuando hacen esto:
const duration = change['duration'];
y el error es :
TS7053: Element implicitly has an 'any' type because expression of type '"duration"' can't be used to index type 'SimpleChange'.
Property 'duration' does not exist on type 'SimpleChange'.
Lo pueden solucionar de esta manera:
const duration = (change as any)['duration'];
Esto se conoce como Type Assertion (Aserción de tipo):
Si sabes que change tiene una propiedad duration, puedes usar una aserción de tipo para decírselo a TypeScript.
Tambien me pasó, pero esto es por que el typo correcto es SimpleChanges que es basicamente un conjunto de SimpleChange que se puede indexar por su key
💡– Puede manejar lógica asíncrona sin problemas
Me llevo que ngOnChanges puede disparar procesos asíncronos, como llamadas a APIs, siempre que se controle bien cuándo y por qué se ejecutan
💡 Ideal para lógica dependiente de inputs
Me llevo que ngOnChanges es perfecto para cálculos, validaciones o efectos secundarios que dependen directamente de cambios en los datos de entrada.
💡Es clave comparar valores anteriores y actuales
Me llevo que comparar previousValue y currentValue evita ejecuciones innecesarias, mejorando el rendimiento y la precisión de la lógica de negocio.
💡Permite identificar exactamente qué input cambió
Me llevo que ngOnChanges recibe un objeto SimpleChanges, con el que puedo detectar qué input cambió y aplicar lógica específica para cada uno.
💡ngOnChanges reacciona a cambios reales de @Input
Me llevo que ngOnChanges se ejecuta cada vez que cambia un @Input, permitiendo reaccionar dinámicamente a modificaciones que vienen desde el componente padre
🧩 Detectar un cambio específico con ngOnChanges en Angular
**Si el valor de**`duration`**ha cambiado** respecto al anterior, se **llama a**`doSomething()`.#### 2.**Comparación con React****EnReact esto se puede hacer de forma más declarativa** con `useEffect`, por ejemplo:```js
useEffect(() => {
doSomething();
}, [duration]);
```Esto es más limpio y conciso.Angular es más explícito, pero también más \*\*verboso\*\*, lo que puede parecer menos elegante en ciertos casos.
1. Detectar un cambio específico conngOnChanges
Si el valor dedurationha cambiado respecto al anterior, se llama adoSomething().
2. Comparación con React
En React esto se puede hacer de forma más declarativa con useEffect, por ejemplo:
useEffect(()=>{doSomething();},[duration]);```Esto es más limpio y conciso.Angular es más explícito, pero también más **verboso**, lo que puede parecer menos elegante en ciertos casos.
La verdad no lo veo necesidad a está validación porque el ngOnchages() ya nos traía el elemento modificado, o que alguien me diga por favor en que le vería la utilidad.
Te sirve para ejecutar lógicas complejas en casos de usos muy específicos.
Tal vez con un caso de uso lo ves mas fácil, pero hay veces que necesitas hacer algo puntual, basado en algún cambio en el valor de una variable