1 (90min) ▸ Bisherige Forms APIs – Reactive & Template-Driven ▸ Probleme mit Signals-Integration ▸ Vorstellung Signal Forms API ▸ Übung 1: Template → Signal Forms (20 min) ▸ Übung 2: Reactive Form → Signal Forms (15 min, Teilmigration mit compatForm) ▸ Übung 3: Bedingte Validierung (10 min) 30 min Kaffeepause
Kurz-Recap • Direktiven: ngModel, ngModelGroup, ngForm • State wird vom Template ins Framework geschrieben • Fokus: Einfacher Einstieg, weniger Boilerplate • Zugriff via Template-Referenzen: #myForm="ngForm"
Daten-Signal als Single Source of Truth • form(<modelSignal>) erzeugt FieldTree • FieldTree spiegelt Datenstruktur 1:1 • Jedes Feld bietet Signals für Wert und Status
• Vollständige Kontrolle über Datenmodell • Deklarative Validierung via Schema • Struktur-Mapping: Datenstruktur = Feldstruktur • Kein ControlValueAccessor-Boilerplate mehr
path spiegelt die Modell-Struktur wider • Typsicher: path.email, path.password • Läuft nur einmal beim Setup, nicht bei jedem Wert-Change • Registriert Regeln für bestimmte Pfade
push() oder removeAt() mehr – Arrays im Model-Signal verwalten Spread-Operator für neue Arrays: [...items, newItem], filter() zum Entfernen Validierung pro Item mit applyEach(path.items, itemSchema) Template: @for (item of form.items; track item) – Tracking per Field-Identität, nicht per Index Stabile Identität: Items mit Objekten behalten ihren State auch beim Umsortieren required() akzeptiert leere Arrays – minLength(path.items, 1) für Mindestanzahl nutzen
liefert Daten • Store lädt initiale Daten (z.B. User-Details) • Model-Signal wird aus Store initialisiert • linkedSignal() verwaltet UI-State • Submit schreibt zurück in Store
nutzen? Signal Forms (stable seit v22) Neue Projekte und Signal-basierte Apps, Typsicherheit aus dem Model, Schema-Validierung (sync + async via validateHttp / validateAsync) Reactive Forms Bestehende Apps mit vielen Formularen, keine Pflicht zur Migration – bleiben vollständig unterstützt Schrittweise Migration compatForm() bettet FormControl / FormGroup in ein Signal Form ein, SignalFormControl bringt Signal-Felder in eine FormGroup, FormValueControl läuft in beiden Welten
Model-First mit automatischer Reaktivität, seit Angular 22 stable Weniger Boilerplate als Reactive Forms, kein ControlValueAccessor Schema-basierte Validierung (sync + async), komponierbar mit schema() / apply() Submission mit FormRoot, submit() und Server-Fehlern direkt am Feld Migration schrittweise über compatForm() und SignalFormControl Passt zum Default: OnPush (v22) + Zoneless (v21) Dokumentation: angular.dev/guide/forms/signals/overview
22 (Stand Oktober 2026) Stable – @angular/forms/signals ist seit v22 (Juni 2026) kein Experiment mehr Breaking: { when } statt Funktion direkt in disabled() / hidden() / readonly() · touched ist Input + touch-Output · markAsTouched() markiert auch Kinder Submission: FormRoot, submission.action / onInvalid / ignoreValidators, submitting(), reset() Validierung: minDate() / maxDate(), getError(), validateTree(), reloadValidation(), debounce('blur'), debounce-Option in validateHttp / validateAsync Controls: transformedValue() mit Parse-Errors, focus() / reset(), Interop mit CVA und formControlName Migration: compatForm(), SignalFormControl, NG_STATUS_CLASSES Doku: 16 Guides inkl. Testing, Model Design und Dynamic Forms with JSON · Material und Aria unterstützen [formField]