Dieses Blatt deckt die zweite Hälfte des Seminars ab: was eine Angular-Anwendung tragfähig macht, nachdem sie läuft. Es ist zum Nachschlagen gedacht und bringt nichts davon bei — dafür sind die Module da. Maßgeblich bleibt die offizielle Angular-Dokumentation. Sprache, Signals, Routing, HTTP und Formulare stehen auf dem ersten Blatt Angular 22 — Kern.
Testlauf steuern
ng test # Beobachtungsmodus
ng test --no-watch --no-progress # Lauf in der Pipeline
ng test --browsers=chromium # echter Browser
Gemeinsame Provider gehören einmal in eine Datei, nicht in jede Spec:
// src/test-providers.ts — in angular.json unter dem Ziel test als providersFile
import { provideHttpClientTesting } from '@angular/common/http/testing';
export default [provideHttpClientTesting()];
Modul: Teststrategie für Angular-Anwendungen
Komponenten- und HTTP-Tests
const fixture = TestBed.createComponent(AuftragKarte);
fixture.componentRef.setInput('auftrag', einAuftrag);
await fixture.whenStable();
fixture.debugElement.query(By.css('[data-test=oeffnen]'))
.triggerEventHandler('click');
const req = httpTesting.expectOne('/api/auftraege');
expect(req.request.method).toBe('GET');
req.flush('Fehler', { status: 500, statusText: 'Server Error' });
httpTesting.verify();
verify() deckt auf, wenn eine Ansicht mehr Anfragen stellt als gedacht. Ein
eigenes Testattribut überlebt Umbauten der Oberfläche besser als eine
CSS-Klasse.
Was ein Test nicht prüfen sollte: private Felder und interne Methoden, die Reihenfolge interner Aufrufe statt des Ergebnisses, reine Gestaltungsklassen, die Anzahl der Change-Detection-Durchläufe.
Modul: Komponenten-, HTTP- und E2E-Tests schreiben
Angular Aria: verfügbare Muster
| Bereich | Muster |
|---|---|
| Auswahl | Listbox, Select, Multiselect |
| Eingabe | Autocomplete, Combobox |
| Navigation | Menu, Menubar, Toolbar |
| Struktur | Accordion, Tabs, Tree, Grid |
import { Toolbar, ToolbarWidget } from '@angular/aria/toolbar';
@Component({ selector: 'sw-filterleiste', imports: [Toolbar, ToolbarWidget] })
export class Filterleiste {}
Installiert wird das Paket mit npm install @angular/aria. Es übernimmt
Tastaturbedienung, ARIA-Attribute und Fokusverwaltung — die Gestaltung bleibt
vollständig beim Projekt. Eigene ARIA-Attribute überschreiben die der
Direktive und machen es dadurch schlechter, nicht besser.
Modul: Barrierefreiheit, UI-Bausteine und Internationalisierung
Rendering: die drei Modi
| Modus | Wann erzeugt | Passt zu |
|---|---|---|
| Client | im Browser | angemeldete Arbeitsbereiche |
| Server | bei jeder Anfrage | personalisierte, aktuelle Inhalte |
| Prerender | beim Bauen | öffentliche, selten geänderte Seiten |
export const serverRoutes: ServerRoute[] = [
{ path: '', renderMode: RenderMode.Prerender },
{ path: 'standorte', renderMode: RenderMode.Server },
{ path: 'auftrag/**', renderMode: RenderMode.Client },
];
Der Modus wird je Route gewählt, nicht für die Anwendung. Registriert wird
die Liste über provideServerRendering mit withRoutes.
Modul: Rendering und Auslieferung
Performance: Ursache und Gegenmittel
| Ursache | Gegenmittel |
|---|---|
| Methodenaufruf im Template | computed in der Klasse |
instabiler track-Ausdruck | stabiler fachlicher Schlüssel |
| ein Signal für die halbe Ansicht | feiner schneiden |
| große Liste vollständig gerendert | Abschnitte oder @defer |
@defer (on viewport; prefetch on idle) {
<sw-verlauf [auftrag]="auftrag()" />
} @placeholder (minimum 300ms) {
<div class="platzhalter"></div>
} @loading (after 100ms) {
<p>Verlauf wird geladen …</p>
}
minimum und after verhindern Flackern, wenn der Inhalt schneller da ist,
als das Auge folgt. Gemessen wird am Produktionsbau mit Drosselung, und der
Ausgangswert wird notiert — sonst gibt es nichts zu vergleichen.
Modul: Performance messen und verbessern
Sicherheit: wer prüft was
| Frage | Browser | Server |
|---|---|---|
| Wer ist angemeldet | zeigt an | prüft |
| Darf diese Aktion sein | blendet aus | entscheidet |
| Welche Daten sichtbar | stellt dar | liefert nur erlaubte |
Der eingebaute Schutz bei Template-Werten ist stärker als jede eigene
Bereinigung. innerHTML nur, wo Interpolation wirklich nicht genügt; eine
Resource URL lässt sich nicht bereinigen, sie wird vertraut oder nicht.
Modul: Sicherheit in Angular-Anwendungen
Was welche Migration ersetzt
| Migration | Ersetzt |
|---|---|
| Standalone | NgModule-Deklarationen |
| Kontrollfluss | ngIf, ngFor, ngSwitch |
| inject | Konstruktorparameter |
| Signal inputs, outputs, queries | Dekoratoren |
| NgClass, NgStyle | class- und style-Bindungen |
Automatisch schlägt Handarbeit: Die Migration trifft auch die vergessenen Stellen, der Diff ist gleichförmig und die Reihenfolge ist erprobt. Eine Migration nach der anderen laufen lassen — gemeinsam vermischen sie sich im Diff.
Modul: Bestandscode modernisieren
KI-Assistenten auf die eigene Version einnorden
| Mittel | Was es beiträgt |
|---|---|
| MCP-Server | Doku-Suche, Build- und Testschritte, Analyse |
| Agent Skills | Anleitungen für idiomatischen Angular-Code |
| Beides zusammen | aktuelles Wissen plus ausführbare Schritte |
{
"mcpServers": {
"angular-cli": { "command": "npx", "args": ["-y", "@angular/cli", "mcp"] }
}
}
Agent Skills kommen über npx skills add mit dem offiziellen Repository
angular/skills dazu.
Modul: KI-Assistenten im Angular-Workflow vorbereiten
Woran ein alter Vorschlag zu erkennen ist
| Gefunden | Erwartet in Angular 22 |
|---|---|
NgModule, declarations | standalone mit imports |
@Input(), @Output() | input(), output() |
ngIf, ngFor, ngSwitch | @if, @for, @switch |
| Konstruktorparameter | inject() |
detectChanges im Code | Signals und Meldung |
Das ist die Liste, die man beim Lesen eines generierten Diffs neben sich legt. Ein Assistent erzeugt Code aus seiner Erinnerung, und die reicht meist mehrere Hauptversionen zurück.
Modul: Generierte Änderungen prüfen und freigeben
Typische Fallen
- Der ausgeblendete Knopf gilt als Schutz der Aktion — er ist eine Anzeigeentscheidung, keine Autorisierung. Dasselbe beim Guard: Die API prüft noch einmal.
- Die API liefert mehr Felder, als die Rolle sehen darf, und die Ansicht blendet sie nur aus.
- Protokollierung im Interceptor schreibt personenbezogene Daten mit.
- Eine Vertrauensausnahme für einen Testfall bleibt stehen.
- Gemessen wird am Entwicklungsbau ohne Drosselung — und nach der Änderung nie wieder.
- Zwei Ursachen gleichzeitig behoben: Die Wirkung ist nicht mehr zuzuordnen.
- Der deferred Baustein wird außerhalb des Blocks referenziert und lädt sofort mit.
- Platzhalter mit anderer Höhe als der Inhalt — das Layout springt.
- Ein Div mit Klick-Ereignis statt eines Knopfes; oder der Fokusrahmen wird aus gestalterischen Gründen entfernt.
- Der Test greift auf
componentInstancezu und prüft Interna, oder er wartet nicht auf die Aktualisierung. verify()fehlt — überzählige Anfragen bleiben unbemerkt.- Karma wird entfernt, bevor alle Tests unter Vitest laufen; oder
fakeAsync-Tests werden übertragen statt umgeschrieben. - Der Assistent bekommt alle Rechte auf einmal und arbeitet auf dem Hauptzweig statt auf einem eigenen.
- Der Vorschlag hält sich an die Aufgabe, aber nicht an den Architekturentscheid — und eine unbeauftragte Verbesserung rutscht mit durch.
Dieses Thema als Schulung für Ihr Team
Dieser Beitrag erklärt das Thema. Damit Ihr Team es danach auch anwendet, gibt es Angular für erfahrene Entwickler als Schulung — an Ihrem eigenen Code, mit den Fragen, die ein Text nicht beantwortet. Sie wählen die Module, wir bauen daraus ein Programm.
6 Tage·ab 900 EUR netto pro Tag (bis 3 Teilnehmende) ·Termin nach Vereinbarung
Als Team-Schulung anfragenZum Seminar Angular für erfahrene Entwickler →