Einleitung: Warum dieses Thema Stack Overflow sprengt?
\n\nWenn Sie jemals in Angular gearbeitet und Änderungen in einem <input> verarbeitet haben, sind Ihnen sicherlich zwei ähnliche Ereignisse begegnet: (change) und (ngModelChange). Auf den ersten Blick – dasselbe. In der Praxis steckt der Teufel im Detail. Die Frage "(change) vs (ngModelChange) in Angular" sammelt tausende Aufrufe auf Stack Overflow, und das nicht ohne Grund: Die falsche Wahl führt zu Bugs, unnötigen Serveranfragen und schlaflosen Nächten.
In diesem Artikel auf PythonLib klären wir ein für alle Mal:
\n- \n
- Was ist der Unterschied zwischen
(change)und(ngModelChange)in Angular? \n - Wann verwendet man welches? \n
- Wie vermeidet man typische Fallstricke? \n
Los geht's! 🚀
\n\nKurz erklärt: Was sind (change) und (ngModelChange)?
\n\n(change) – das ist ein standardmäßiges DOM-Ereignis, das ausgelöst wird, wenn ein Element den Fokus verliert (blur) und sich sein Wert geändert hat. Angular kapselt lediglich das native change-Ereignis.
(ngModelChange) – das ist ein Ereignis der Direktive ngModel. Es wird jedes Mal ausgelöst, wenn sich das Modell ändert – buchstäblich bei jedem Tastendruck (sofern nicht ngModelOptions verwendet wird).
Wichtig:\n\nngModelChangekann nicht ohne[(ngModel)]verwendet werden. Es ist Teil der Zwei-Wege-Bindung.
Hier ein minimales Beispiel in TypeScript, um den Unterschied zu sehen:
\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="Geben Sie den Namen ein">\n <p>Wert: {{ 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\nVersuchen Sie, "Angular" einzugeben – Sie werden sehen: ngModelChange wird 7 Mal ausgelöst (pro Buchstabe), change dagegen nur einmal, wenn Sie außerhalb des Feldes klicken.
Hauptunterschiede: Vergleichstabelle
\n\nZur Veranschaulichung hier eine Tabelle der wichtigsten Unterschiede zwischen (change) vs (ngModelChange):
\n\n| Kriterium | \n(change) | \n(ngModelChange) | \n
|---|---|---|
| Ereignistyp | \nNatives DOM-Ereignis | \nAngular-Ereignis (EventEmitter) | \n
| Wann wird es ausgelöst | \nBei Fokusverlust + Wertänderung | \nBei jeder Modelländerung (jede Eingabe) | \n
| Wert in $event | \nEvent-Objekt (value muss extrahiert werden) | \nNeuer Modellwert (String, Zahl usw.) | \n
| Abhängigkeit von ngModel | \nNicht erforderlich (kann auf jedem input verwendet werden) | \nErfordert [(ngModel)] oder [ngModel] | \n
| Leistung | \nHoch (wird selten ausgelöst) | \nKann häufig sein (bei jedem Tastendruck) | \n
| Verwendung mit Formularen | \nReaktive Formulare, template-driven | \nNur template-driven Formulare | \n
Wann sollte man (change) verwenden?
\n\n(change) ist Ihre Wahl, wenn:
\n- \n
- Sie nur reagieren müssen, wenn das Feld den Fokus verliert und sich der Wert geändert hat. \n