Introducción: ¿por qué este tema explota Stack Overflow?
\n\nSi alguna vez has escrito en Angular y te has encontrado con el manejo de cambios en un <input>, seguramente has visto dos eventos similares: (change) y (ngModelChange). A primera vista, son lo mismo. En la práctica, el diablo está en los detalles. La pregunta "(change) vs (ngModelChange) in Angular" acumula miles de visitas en Stack Overflow, y no es casualidad: una elección incorrecta provoca errores, solicitudes innecesarias al servidor y noches sin dormir.
En este artículo de PythonLib aclararemos de una vez por todas:
\n- \n
- ¿En qué se diferencian
(change)y(ngModelChange)en Angular? \n - ¿Cuándo usar cada uno? \n
- ¿Cómo evitar las trampas típicas? \n
¡Allá vamos! 🚀
\n\nEn resumen: ¿qué son (change) y (ngModelChange)?
\n\n(change) es un evento DOM estándar que se dispara cuando un elemento pierde el foco (blur) y su valor ha cambiado. Angular simplemente envuelve el change nativo.
(ngModelChange) es un evento de la directiva ngModel. Se dispara cada vez que el modelo cambia, literalmente con cada pulsación de tecla (a menos que se use ngModelOptions).
Importante:\n\nngModelChangeno se puede usar sin[(ngModel)]. Es parte del enlace bidireccional.
Aquí tienes un ejemplo mínimo en TypeScript para ver la diferencia:
\n\n// app.component.ts\nimport { Component } from '@angular/core';\n\n@Component({\n selector: 'app-root',\n template: `\n <input\n [ngModel]="name"\n (ngModelChange)="onNgModelChange($event)"\n (change)="onChange($event)"\n placeholder="Ingrese nombre">\n <p>Valor: {{ name }}</p>\n `\n})\nexport class AppComponent {\n name = '';\n\n onNgModelChange(value: string) {\n console.log('ngModelChange:', value);\n }\n\n onChange(event: Event) {\n console.log('change:', (event.target as HTMLInputElement).value);\n }\n}\n\n\nIntenta escribir "Angular" y verás: ngModelChange se disparará 7 veces (una por letra), mientras que change solo una vez, cuando hagas clic fuera del campo.
Diferencias principales: tabla comparativa
\n\nPara que quede claro, aquí tienes una tabla con las diferencias clave entre (change) vs (ngModelChange):
\n\n| Criterio | \n(change) | \n(ngModelChange) | \n
|---|---|---|
| Tipo de evento | \nEvento DOM nativo | \nEvento de Angular (EventEmitter) | \n
| Cuándo se dispara | \nAl perder el foco + cambio de valor | \nCon cada cambio del modelo (cada entrada) | \n
| Valor en $event | \nObjeto Event (hay que extraer el value) | \nNuevo valor del modelo (cadena, número, etc.) | \n
| Dependencia de ngModel | \nNo requerida (se puede usar en cualquier input) | \nRequiere [(ngModel)] o [ngModel] | \n
| Rendimiento | \nAlto (se dispara con poca frecuencia) | \nPuede ser frecuente (en cada pulsación de tecla) | \n
| Uso con formularios | \nFormularios reactivos, template-driven | \nSolo formularios template-driven | \n
¿Cuándo usar (change)?
\n\n(change) es tu elección si:
\n- \n
- Necesitas reaccionar solo cuando el campo