Template-driven forms in Angular
"Cheat sheet" zu Template driven forms in angular
Template-driven forms ist die einfachste Variante für Formulare in Angular: Sie basieren auf den regulären Angular Templates in Verbindung mit ngModel für Databinding.
Um die Template-driven forms überhaupt verwenden zu können, muss FormsModule in der Applikation (app.module.ts) importiert werden:
...
import { FormsModule } from '@angular/forms';
...
@NgModule({
imports: [
...,
FormsModule
],
...
Um ein Formular mit Template-driven forms zu gestallten, können wir die übliche Template Syntax in Angular verwenden:
<form #foobarForm="ngForm">
...
<input type="text" name="foobar.name" required [(ngModel)]="foobar.name">
...
</form>
Angular verbindet automatisch die ngForm Direktive mit dem <form> Formular-Element:
- ngForm überwacht den Status (valid, changed, touched, pristine) einzelner Eingabe-Elemente innerhalb der Form
- ngForm hält auch den gesamt Status aller Formelemente (valid-Property, zB. foobarForm.form.valid)
- Jedes Eingabe-Element innerhalb der Form muss eine "name" Property besitzen
Angular setzt in Abhängigkeit vom Status einer Form Komponente eine entsprechende CSS-Klasse/Klassen:
- ng-touched vs ng-untouched: In Abhängigkeit davon ob die Eingabe-Komponente bearbeitet wurde
- ng-dirty vs ng-pristine: In Abhängigkeit davon ob der Wert der Eingabe-Komponente geändert wurde
- ng-valid vs ng-invalid: In Abhängigkeit davon ob der eingegebene Wert gültig ist
Zur Anzeige von Fehlermeldungen benötigen wir noch eine Referenz auf die NgModel-Direktive der Eingabekomponente. Das bekommt man über eine "template reference variable" #foobarName="ngModel" :
<div>
<label for="foobar-name">Name</label>
<input type="text" id="foobar-name"
name="foobarName"
#foobarName="ngModel"
[(ngModel)]="foobar.name" required>
<div [hidden]="foobarName.valid || foobarName.pristine" class="danger">
Das Feld darf nicht leer sein
</div>
</div>
Damit kann man den Status des Eingabefeldes abfragen, zB: foobarName.valid
und in Abhängigkeit davon eine Fehlermeldung anzeigen.
Als letztes behandeln wir noch das Submit/Absenden der Daten eines Formulars:
<form #foobarForm="ngForm" (ngSubmit)="submitFoobar()">
...
<button type="submit" [disabled]="!foobarForm.form.valid">Absenden</button>
...
</form>
Hier wird über die ngSubmit event-Eigenschaft die Methode submitFoobar aufgerufen, die in der zugehörigen Komponente definiert sein muss. Wir benötigen keinen zusätzlichen (click)-Handler an dem Submit-Button: Standardmäßig ruft ein mit type="submit" definierter Button immer die Submit-Routine des Formulars.