You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: material/template-forms/README.md
+45-35Lines changed: 45 additions & 35 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,29 +1,35 @@
1
1
---
2
-
title: '[WIP] Formulare mit Template-Driven Forms'
3
-
published: 2026-02-10
4
-
lastModified: 2026-02-05
5
-
hidden: true
2
+
title: 'Formulare mit Template-Driven Forms'
3
+
published: 2026-04-08
4
+
lastModified: 2026-04-08
6
5
---
7
6
8
-
> **Hinweis:** Dieser Artikel ist ein Zusatzmaterial zum [Angular-Buch](https://angular-buch.com).
9
-
> Im Buch behandeln wir **Signal Forms** – den neuesten Ansatz zur Formularverarbeitung in Angular.
10
-
> Template-Driven Forms und Reactive Forms sind weiterhin vollständig unterstützt und in vielen Projekten im Einsatz.
11
-
>
12
-
> Dieser Artikel behandelt **Template-Driven Forms**.
13
-
> Wenn du dich für den modellbasierten Ansatz interessierst, schau dir unseren Artikel zu [Reactive Forms](/reactive-forms) an.
7
+
Formulare gehören zu den zentralen Bausteinen jeder Webanwendung.
8
+
Mit den älteren **Template-Driven Forms** bietet Angular einen Ansatz, bei dem die Formularlogik direkt im Template definiert wird.
9
+
Dieser Artikel stellt den Ansatz im Detail vor.
14
10
15
-
---
11
+
## Inhalt
12
+
13
+
[[toc]]
14
+
15
+
## Formulare in Angular
16
+
17
+
Angular bietet insgesamt drei Ansätze für die Formularverarbeitung an: **Template-Driven Forms**, **Reactive Forms** und **Signal Forms**.
18
+
Signal Forms ist die moderne Lösung, die Ende 2025 mit Angular 21 als Experimental-Version eingeführt wurde.
19
+
Im Angular-Buch findest du zu den modernen Signal Forms mehrere ausführliche Kapitel.
20
+
21
+
Template-Driven Forms sind der älteste der drei Ansätze.
22
+
Sie eignen sich vor allem für überschaubare Formulare, bei denen die gesamte Formularlogik bequem im Template mit der Direktive `ngModel` abgebildet werden kann.
16
23
17
-
Angular bietet drei Ansätze für die Formularverarbeitung: **Template-Driven Forms**, **Reactive Forms** und **Signal Forms**.
18
-
Template-Driven Forms sind der älteste Ansatz und eignen sich besonders für einfache Formulare - insbesondere in Anwendungen, die noch mit einer älteren Angular Version (vor Angular 22) arbeiten.
19
-
Die Formularlogik wird dabei vollständig im Template mit der Direktive `ngModel` abgebildet.
24
+
Reactive Forms waren lange der De-facto-Standard für Formulare in Angular.
25
+
Wenn du dich für diesen Ansatz interessierst, schau dir unseren [Artikel zu Reactive Forms](/reactive-forms) an.
20
26
21
27
## Template-Driven Forms einrichten
22
28
23
29
Damit wir Template-Driven Forms in der Anwendung einsetzen können, müssen wir alle nötigen Bausteine an Bord holen.
24
30
Angular bündelt sie in einem Modul mit dem Namen `FormsModule`.
25
31
Darin befinden sich unter anderem die Direktiven, die wir später in den Templates einsetzen.
26
-
Wir importieren das `FormsModule` in der Komponente, in dem sich unser Formular befinden soll.
32
+
Wir importieren das `FormsModule` in der Komponente, in der sich unser Formular befinden soll.
27
33
28
34
```typescript
29
35
import { FormsModule } from'@angular/forms';
@@ -38,12 +44,12 @@ export class MyForm { }
38
44
## Datenmodell in der Komponente
39
45
40
46
Bevor wir das HTML-Markup für das Formular bauen, planen wir zunächst, welche Daten erfasst werden müssen.
41
-
Diese Daten müssen in der Komponentenklasse vorliegen, am besten als zusammenhängendes Objekt in einem Property der Klasse.
47
+
Diese Daten müssen in der Komponentenklasse vorliegen, am besten als zusammenhängendes Objekt in einem Signal.
42
48
Das Objekt enthält immer konkrete Daten: Bei der Initialisierung sind das die Default-Werte; sobald etwas eingetippt wurde, finden wir diese Eingaben in dem Objekt.
43
49
44
50
```typescript
45
51
@Component({ /* ... */ })
46
-
exportclassSimpleFormComponent {
52
+
exportclassMyForm {
47
53
protected formData =signal({
48
54
username: '',
49
55
password: ''
@@ -55,8 +61,7 @@ export class SimpleFormComponent {
55
61
56
62
Im Template der Komponente legen wir uns nun ein HTML-Formular mit einem `<form>`-Tag an.
57
63
Darin befinden sich die Formularfelder, z. B. einfache oder mehrzeilige Textfelder, Checkboxen, Dropdowns oder Passwortfelder.
58
-
Diese Formularfelder sollten natürlich zu dem Datenmodell aus der Komponente passen.
59
-
Außerdem sollten wir einen Submit-Button anlegen, um das Formular abzusenden.
64
+
Diese Formularfelder sollten zu dem Datenmodell aus der Komponente passen.
60
65
61
66
Jedes Formularfeld muss ein `name`-Attribut besitzen, damit Angular die Felder identifizieren kann.
62
67
@@ -98,6 +103,11 @@ Wir setzen `ngModel` ein und verknüpfen jedes unserer Formularfelder im Templat
98
103
```
99
104
100
105
Die Daten zwischen Formularfeldern und Komponente werden nun stets synchronisiert.
106
+
Zum Ausprobieren können wir den Wert des Signals `formData` im Template anzeigen, indem wir die `JsonPipe` verwenden:
107
+
108
+
```html
109
+
<pre>{{ formData() | json }}</pre>
110
+
```
101
111
102
112
## Eingaben validieren
103
113
@@ -118,9 +128,7 @@ Sie werden als Attribute auf den Formularfeldern eingesetzt.
118
128
Setzen wir diese Validatoren ein, kümmert sich Angular automatisch im Hintergrund darum, den eingegebenen Wert gegen diese Regeln zu prüfen.
119
129
Die Zustände des Formulars werden stets aktualisiert, sodass wir sofort ein visuelles Feedback zur Eingabe anzeigen können.
120
130
121
-
Wenn die Regeln für die Validierung komplexer sind, lassen sie sich nicht mit einem einzigen Validator abdecken.
122
-
Deshalb können wir beliebig viele Validatoren auf ein Control setzen.
123
-
Das Passwortfeld aus unserem Beispiel kann beispielsweise folgende Regeln besitzen:
131
+
Das Passwortfeld aus unserem Beispiel könnte die folgenden Regeln besitzen:
124
132
125
133
- muss ausgefüllt sein
126
134
- muss mindestens 8 Zeichen enthalten
@@ -145,7 +153,7 @@ Wir haben auf jedem Formularfeld die Direktive `ngModel` verwendet.
145
153
Was trivial aussieht, erledigt im Hintergrund eine Menge wichtiger Schritte, um das Formular zu verwalten.
146
154
Für jedes Feld wird automatisch ein Objekt initialisiert, das den Zustand der Formularfelder kontrolliert.
147
155
148
-
Ein Feld kann sechs unterschiedliche Zustände besitzen, die sich nach drei Fragestellungen richten:
156
+
Den Zustand können wir über verschiedene Zustandsflags auslesen:
149
157
150
158
| Zustand | ja | nein |
151
159
|---------|-----|------|
@@ -195,11 +203,11 @@ So können wir z. B. eine Meldung abhängig vom Formularzustand anzeigen.
195
203
Sobald das Formular mit dem Submit-Button abgeschickt wird, wollen wir die Eingaben verarbeiten und z. B. zum Server schicken.
196
204
197
205
Dazu benötigen wir als Erstes eine Methode in der Komponente, die ausgeführt wird, sobald das Formular abgeschickt wird.
198
-
Hier können wir auf das Objekt`formData` zugreifen und diese Werte weiterverarbeiten, denn Angular hat durch das Two-Way Binding stets das Formular und das Datenmodell synchron gehalten.
206
+
Hier können wir auf das Signal`formData` zugreifen und diese Werte weiterverarbeiten, denn Angular hat durch das Two-Way Binding stets das Formular und das Datenmodell synchron gehalten.
199
207
200
208
```typescript
201
209
@Component({ /* ... */ })
202
-
exportclassSimpleFormComponent {
210
+
exportclassMyForm {
203
211
protected formData =signal({
204
212
username: '',
205
213
password: ''
@@ -229,9 +237,9 @@ Nachdem die Daten abgeschickt wurden, besitzt das Formular noch immer die letzte
229
237
Wenn das Formular direkt verwendet werden soll, um weitere Daten zu erfassen, fehlt noch ein wichtiger Schritt:
230
238
Wir müssen alle Zustände und Werte zurücksetzen.
231
239
232
-
Angular initialisiert auf jedem `<form>`-Tag eine Direktive mit dem Namen `NgForm`.
240
+
Verwenden wir Template-Driven Forms, initialisiert Angular auf jedem `<form>`-Tag eine Direktive mit dem Namen `NgForm`.
233
241
Das passiert vollautomatisch, ohne dass wir im Template zusätzlichen Code schreiben müssen.
234
-
Zugriff auf dieses `NgForm` erhalten wir wieder mit einer Elementreferenz, die diesmal allerdings auf `ngForm` verweist.
242
+
Zugriff auf dieses `NgForm` erhalten wir wieder mit einer Elementreferenz:
235
243
236
244
```html
237
245
<form(ngSubmit)="submitForm()"#form="ngForm">
@@ -242,8 +250,8 @@ Zugriff auf dieses `NgForm` erhalten wir wieder mit einer Elementreferenz, die d
242
250
243
251
Auf diesem Objekt existiert unter anderem die Methode `reset()`.
244
252
Damit wir diese Methode aufrufen können, benötigen wir allerdings in der Komponentenklasse Zugriff auf diese Elementreferenz.
245
-
An dieser Stelle können wir eine weitere Funktion von Angular nutzen `viewChild()`.
246
-
Damit können wir aus der Komponentenklasse heraus auf eine Elementreferenz im Template zugreifen.
253
+
Dafür können wir die Funktion `viewChild()` einsetzen:
254
+
Von der Komponentenklasse aus greifen wir auf eine Elementreferenz im Template zu.
247
255
Den Wert erhalten wir als Signal.
248
256
249
257
Das Argument der Funktion ist dabei der Name der Elementreferenz aus dem Template.
@@ -264,7 +272,7 @@ export class SimpleFormComponent {
264
272
});
265
273
266
274
submitForm() {
267
-
console.log(this.formData);
275
+
console.log(this.formData());
268
276
// Daten weiterverarbeiten
269
277
270
278
// Formular zurücksetzen
@@ -275,7 +283,7 @@ export class SimpleFormComponent {
275
283
```
276
284
277
285
Bitte bedenke, dass auch die Daten zurückgesetzt werden müssen.
278
-
Das Signal, in dem der Formularwert steht (im vorherigen Beispiel: `formData()`), muss also mit dem Startzustand überschrieben werden, damit die Inhalte zurückgesetzt werden.
286
+
Das Signal, in dem der Formularwert steht, muss also mit dem Startzustand überschrieben werden, damit die Inhalte zurückgesetzt werden.
279
287
280
288
Das `NgForm`-Objekt können wir übrigens für viele weitere Zwecke verwenden.
281
289
Beispielsweise kennt das Objekt immer alle Zustände seiner Formularfelder, sodass wir komplexere Validierungsregeln umsetzen können.
@@ -287,10 +295,12 @@ Beispielsweise kennt das Objekt immer alle Zustände seiner Formularfelder, soda
287
295
- Das Two-Way Binding mit `[(ngModel)]` bindet ein Formularfeld an ein Property der Komponente. Die Daten werden in beide Richtungen synchronisiert.
288
296
- Wird das Formular mit einem Submit-Button abgeschickt, wird das Event `ngSubmit` ausgelöst. Wir können das Event auf dem `<form>`-Element abonnieren: `(ngSubmit)="submitForm()"`.
289
297
- Angular bringt einige eingebaute Validatoren mit: `required`, `min`, `max`, `minlength`, `maxlength`, `pattern` und `email`. Sie werden als Attribute auf den Formularfeldern eingesetzt.
290
-
- Für die sechs Zustände eines Formulars werden automatisch CSS-Klassen gesetzt.
298
+
- Für die Zustände eines Formularfelds werden automatisch CSS-Klassen mit dem Präfix `ng-` gesetzt.
291
299
- Mit Elementreferenzen können wir auf die Instanzen von `ngModel` und `ngForm` zugreifen, um die Zustände direkt auszulesen.
292
-
- Mit `viewChild('myForm')` können wir in der Komponentenklasse auf eine Elementreferenz im Template zugreifen. Damit können wir z. B. ein Formular zurücksetzen oder die Zustände auslesen.
300
+
- Mit `viewChild('form')` können wir in der Komponentenklasse auf eine Elementreferenz im Template zugreifen. Damit können wir z. B. ein Formular zurücksetzen oder die Zustände auslesen.
293
301
294
302
## Empfehlung
295
303
296
-
Wir empfehlen nach Möglichkeit in modernen Angular Anwendungen stets auf Signal Forms zu setzen wie du sie im Buch kennengelernt hast. Template Driven Forms solltest du nur in Projekten einzusetzen, in denen eine Migration auf eine moderne Angular Version ab Angular 22 (noch) nicht möglich ist und wo kein komplexes Eingabeformular benötigt wird.
304
+
Template-Driven Forms werden nach wie vor vollständig vom Framework unterstützt.
305
+
Sie eignen sich besonders für einfache Formulare, bei denen die Logik überschaubar bleibt.
306
+
Für komplexere Szenarien empfehlen wir [Reactive Forms](/reactive-forms) oder – sobald die API stabil ist – die modernen **Signal Forms**, die wir im Angular-Buch ausführlich behandeln.
0 commit comments