Skip to content

Commit 9095c5f

Browse files
committed
material: TDF
1 parent 0d8b2eb commit 9095c5f

2 files changed

Lines changed: 46 additions & 35 deletions

File tree

material/reactive-forms/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ Signal Forms ist die moderne Lösung, die Ende 2025 mit Angular 21 als Experimen
2020
Im Angular-Buch findest du zu den modernen Signal Forms mehrere ausführliche Kapitel.
2121

2222
Template-Driven Forms sind der älteste Ansatz, der vor allem für kleine Formulare lohnenswert war.
23+
Wenn du dich dafür interessierst, schau dir unseren [Artikel zu Template-Driven Forms](/template-forms) an.
2324

2425
Reactive Forms gelten noch immer als Standard für die Formularverarbeitung in Angular und werden in vielen Projekten eingesetzt.
2526
Wir gehen allerdings davon aus, dass die neuen Signal Forms diesen Platz einnehmen werden, sobald die API **stable** ist.

material/template-forms/README.md

Lines changed: 45 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,35 @@
11
---
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
65
---
76

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.
1410

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.
1623

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.
2026

2127
## Template-Driven Forms einrichten
2228

2329
Damit wir Template-Driven Forms in der Anwendung einsetzen können, müssen wir alle nötigen Bausteine an Bord holen.
2430
Angular bündelt sie in einem Modul mit dem Namen `FormsModule`.
2531
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.
2733

2834
```typescript
2935
import { FormsModule } from '@angular/forms';
@@ -38,12 +44,12 @@ export class MyForm { }
3844
## Datenmodell in der Komponente
3945

4046
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.
4248
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.
4349

4450
```typescript
4551
@Component({ /* ... */ })
46-
export class SimpleFormComponent {
52+
export class MyForm {
4753
protected formData = signal({
4854
username: '',
4955
password: ''
@@ -55,8 +61,7 @@ export class SimpleFormComponent {
5561

5662
Im Template der Komponente legen wir uns nun ein HTML-Formular mit einem `<form>`-Tag an.
5763
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.
6065

6166
Jedes Formularfeld muss ein `name`-Attribut besitzen, damit Angular die Felder identifizieren kann.
6267

@@ -98,6 +103,11 @@ Wir setzen `ngModel` ein und verknüpfen jedes unserer Formularfelder im Templat
98103
```
99104

100105
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+
```
101111

102112
## Eingaben validieren
103113

@@ -118,9 +128,7 @@ Sie werden als Attribute auf den Formularfeldern eingesetzt.
118128
Setzen wir diese Validatoren ein, kümmert sich Angular automatisch im Hintergrund darum, den eingegebenen Wert gegen diese Regeln zu prüfen.
119129
Die Zustände des Formulars werden stets aktualisiert, sodass wir sofort ein visuelles Feedback zur Eingabe anzeigen können.
120130

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:
124132

125133
- muss ausgefüllt sein
126134
- muss mindestens 8 Zeichen enthalten
@@ -145,7 +153,7 @@ Wir haben auf jedem Formularfeld die Direktive `ngModel` verwendet.
145153
Was trivial aussieht, erledigt im Hintergrund eine Menge wichtiger Schritte, um das Formular zu verwalten.
146154
Für jedes Feld wird automatisch ein Objekt initialisiert, das den Zustand der Formularfelder kontrolliert.
147155

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:
149157

150158
| Zustand | ja | nein |
151159
|---------|-----|------|
@@ -195,11 +203,11 @@ So können wir z. B. eine Meldung abhängig vom Formularzustand anzeigen.
195203
Sobald das Formular mit dem Submit-Button abgeschickt wird, wollen wir die Eingaben verarbeiten und z. B. zum Server schicken.
196204

197205
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.
199207

200208
```typescript
201209
@Component({ /* ... */ })
202-
export class SimpleFormComponent {
210+
export class MyForm {
203211
protected formData = signal({
204212
username: '',
205213
password: ''
@@ -229,9 +237,9 @@ Nachdem die Daten abgeschickt wurden, besitzt das Formular noch immer die letzte
229237
Wenn das Formular direkt verwendet werden soll, um weitere Daten zu erfassen, fehlt noch ein wichtiger Schritt:
230238
Wir müssen alle Zustände und Werte zurücksetzen.
231239

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`.
233241
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:
235243

236244
```html
237245
<form (ngSubmit)="submitForm()" #form="ngForm">
@@ -242,8 +250,8 @@ Zugriff auf dieses `NgForm` erhalten wir wieder mit einer Elementreferenz, die d
242250

243251
Auf diesem Objekt existiert unter anderem die Methode `reset()`.
244252
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.
247255
Den Wert erhalten wir als Signal.
248256

249257
Das Argument der Funktion ist dabei der Name der Elementreferenz aus dem Template.
@@ -255,7 +263,7 @@ import { /* ... */, viewChild } from '@angular/core';
255263
import { NgForm } from '@angular/forms';
256264

257265
@Component({ /* ... */ })
258-
export class SimpleFormComponent {
266+
export class MyForm {
259267
readonly form = viewChild<NgForm>('form');
260268

261269
protected formData = signal({
@@ -264,7 +272,7 @@ export class SimpleFormComponent {
264272
});
265273

266274
submitForm() {
267-
console.log(this.formData);
275+
console.log(this.formData());
268276
// Daten weiterverarbeiten
269277

270278
// Formular zurücksetzen
@@ -275,7 +283,7 @@ export class SimpleFormComponent {
275283
```
276284

277285
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.
279287

280288
Das `NgForm`-Objekt können wir übrigens für viele weitere Zwecke verwenden.
281289
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
287295
- Das Two-Way Binding mit `[(ngModel)]` bindet ein Formularfeld an ein Property der Komponente. Die Daten werden in beide Richtungen synchronisiert.
288296
- 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()"`.
289297
- 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.
291299
- 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.
293301

294302
## Empfehlung
295303

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

Comments
 (0)