Introdução: por que este tópico explode no Stack Overflow?
\n\nSe você já escreveu em Angular e lidou com o tratamento de mudanças em <input>, certamente viu dois eventos semelhantes: (change) e (ngModelChange). À primeira vista — a mesma coisa. Na prática — o diabo está nos detalhes. A pergunta "(change) vs (ngModelChange) in Angular" acumula milhares de visualizações no Stack Overflow, e não é à toa: a escolha errada leva a bugs, requisições extras ao servidor e noites sem dormir.
Neste artigo no PythonLib, vamos de uma vez por todas esclarecer:
\n- \n
- Qual a diferença entre
(change)e(ngModelChange)no Angular? \n - Quando usar cada um? \n
- Como evitar as armadilhas comuns? \n
Vamos lá! 🚀
\n\nResumindo: o que são (change) e (ngModelChange)?
\n\n(change) — é um evento DOM padrão que é disparado quando o elemento perde o foco (blur) e seu valor mudou. O Angular simplesmente encapsula o evento nativo change.
(ngModelChange) — é um evento da diretiva ngModel. Ele é disparado toda vez que o modelo muda — literalmente a cada pressionamento de tecla (a menos que ngModelOptions seja usado).
Importante:\n\nngModelChangenão pode ser usado sem[(ngModel)]. Ele faz parte da ligação bidirecional.
Aqui está um exemplo mínimo em TypeScript para ver a diferença:
\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="Digite o nome">\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\nTente digitar "Angular" — e você verá: ngModelChange será disparado 7 vezes (uma por letra), enquanto change será disparado apenas uma vez, quando você clicar fora do campo.
Principais diferenças: tabela comparativa
\n\nPara ficar claro, aqui está uma tabela com as principais diferenças entre (change) vs (ngModelChange):
\n\n| Critério | \n(change) | \n(ngModelChange) | \n
|---|---|---|
| Tipo de evento | \nEvento DOM nativo | \nEvento Angular (EventEmitter) | \n
| Quando é disparado | \nAo perder o foco + valor alterado | \nA cada alteração do modelo (cada entrada) | \n
| Valor em $event | \nObjeto Event (é necessário extrair o value) | \nNovo valor do modelo (string, número, etc.) | \n
| Dependência do ngModel | \nNão é necessário (pode ser usado em qualquer input) | \nRequer [(ngModel)] ou [ngModel] | \n
| Desempenho | \nAlto (disparado raramente) | \nPode ser frequente (a cada keypress) | \n
| Uso com formulários | \nFormulários reativos, template-driven | \nApenas formulários template-driven | \n
Quando usar (change)?
\n\n(change) — é a sua escolha se:
\n- \n
- Você precisa reagir apenas quando o campo