AngularAtlasAusg. 22.2

Kap. 03Signals & Reaktivität18 / 75

Listen: suchen, filtern, sortieren, blättern

Eine Kette von computed-Signals, die nur neu berechnet, was sich geändert hat — mit den Filtern in der URL, damit ein Link dieselbe Ansicht öffnet.

~0 Min. Lesezeit Offizielle Doku

Fast jede App hat eine Liste, die man durchsuchen, filtern, sortieren und durchblättern kann. Mit Signals sind das ein paar Zeilen: Die Filter sind Signals, und die Liste auf dem Bildschirm ist ein computed, das daraus gebaut wird. Spannend ist, wie man dieses computed aufteilt.

Diese Seite baut Schritt für Schritt einen Katalog: eine Kette von computed-Signals, die nur neu berechnet, was sich geändert hat, linkedSignal, um die Seite zurückzusetzen, und Filter in der URL, damit ein Link oder ein Reload dieselbe Ansicht zurückbringt.

Warum das wichtig ist
Eine Liste, die bei jedem Tastendruck alles neu berechnet, ist mit 50 Einträgen kein Problem und ruckelt bei 5.000. Eine Liste, deren Filter nur im Speicher leben, verliert sie beim Reload, und ihr Zurück-Button tut etwas, womit niemand rechnet.

Der Zustand: ein paar Signals

Jedes Steuerelement schreibt ein Signal: query, category, sort, page. Sonst wird nichts gespeichert — die sichtbare Liste ist immer abgeleitet und kann sich daher nie von den Filtern entfernen.

export class Catalog {
  private readonly products = inject(ProductStore).all; // Signal<Product[]>

  // ein Signal pro Steuerelement
  readonly query = signal('');
  readonly category = signal<Category | 'all'>('all');
  readonly sort = signal<Sort>('relevance');
  readonly page = signal(1);
}

Eine Kette von computed-Signals

Pack jeden Schritt in ein eigenes computed: filtered liest die Daten und die Filter, sorted liest filtered und die Sortierung, visible liest sorted und die Seite. Ein computed läuft nur wieder, wenn sich etwas geändert hat, das es gelesen hat — Umblättern führt also nur den Ausschnitt neu aus.

// jeder Schritt liest nur, was er braucht — und läuft nur neu, wenn sich das ändert
readonly filtered = computed(() => {
  const q = fold(this.query().trim());
  const cat = this.category();
  return this.products().filter(
    (p) => (cat === 'all' || p.category === cat) && fold(p.name).includes(q),
  );
});

readonly sorted = computed(() =>
  this.filtered().toSorted(comparator(this.sort())), // eine Kopie: nie das Array des Signals sortieren
);

readonly visible = computed(() => {
  const start = (this.page() - 1) * PAGE_SIZE;
  return this.sorted().slice(start, start + PAGE_SIZE); // die Seite ändert sich → nur das hier läuft
});

readonly pages = computed(() => Math.max(1, Math.ceil(this.sorted().length / PAGE_SIZE)));
LiveDerselbe Katalog in zwei Formen
TelefonTelefone & Tablets351,99 €★ 2.6
Telefon MiniTelefone & Tablets509,99 €★ 2.7
Telefon AirTelefone & Tablets552,99 €★ 4.3
Telefon ProTelefone & Tablets920,99 €★ 4.6
Telefon MaxTelefone & Tablets778,99 €★ 4.8
TabletTelefone & Tablets377,99 €★ 3.9
Seite 1 von 11 · 65 Produkte
SchrittLäufeLetzter Lauf
filtered165 Produkte geprüft
sorted164 Vergleiche
visible16 Einträge genommen
Probier: nächste Seite → nur visible läuft.
Tippe ins Suchfeld, ändere die Sortierung, blättere dann durch die Seiten — und beobachte die Spalte Läufe. Wechsle dann zu einem großen computed und mach dasselbe.

In der Kette führen die Blätter-Buttons nur visible aus; Sortieren führt sorted und visible aus; nur die Filter erreichen filtered. In einem großen computed filtert und sortiert jeder Klick alle 65 Produkte neu. Auch die Reihenfolge zählt: zuerst filtern (weniger zu sortieren), zuletzt ausschneiden. Und es läuft nur die Form, die auf dem Bildschirm ist: Ein computed, das niemand liest, wird nie ausgeführt. Tippst du schnell, siehst du vielleicht weniger Läufe als Tastendrücke: Ein computed rechnet nur neu, wenn es gelesen wird, und Angular liest es einmal pro Rendering.

Zurück auf Seite 1, wenn sich die Filter ändern

Bist du auf Seite 5 und suchst etwas mit zwei Seiten Ergebnissen, landest du auf „Seite 5 von 2“. Genau dafür ist linkedSignal da: ein beschreibbares Signal, das sich selbst zurücksetzt, sobald sich seine Quelle ändert — hier jeder Filter oder die Sortierung. Siehe linkedSignal.

// ein beschreibbares Signal, das auf 1 zurückgeht, wenn sich ein Filter oder die Sortierung ändert
readonly page = linkedSignal({
  source: () => [this.query(), this.category(), this.sort()],
  computation: () => 1,
});

next() {
  this.page.update((p) => Math.min(p + 1, this.pages()));
}

Eine Suche, die sich richtig anfühlt

Vergleiche normalisierten Text, kleingeschrieben und ohne diakritische Zeichen (normalize('NFD')), damit „kopfhorer“ „Kopfhörer“ findet. Sortiere Namen mit localeCompare in der Sprache des Nutzers. Bei Suchen, die zum Server gehen, warte mit debounced() auf eine Tipppause.

/** kleingeschrieben, ohne diakritische Zeichen: "kopfhorer" findet "Kopfhörer", "cafe" findet "Café" */
export function fold(text: string): string {
  return text.normalize('NFD').replace(/\p{Diacritic}/gu, '').toLowerCase();
}

// Namen so sortiert, wie der Nutzer es in seiner Sprache erwartet
const byName = (a: Product, b: Product) => a.name.localeCompare(b.name, locale);

Rendering: track nach id

@for (p of visible(); track p.id) lässt Angular bestehende Zeilen verschieben, statt sie neu zu erzeugen, wenn sich die Reihenfolge ändert. Mit track $index würde nach jedem Sortieren jede Zeile neu gerendert. Mehr unter Control Flow.

<input type="search" [value]="query()" (input)="query.set(search.value)" #search />

@for (p of visible(); track p.id) {
  <app-product-row [product]="p" />
} @empty {
  <p>Keine passenden Produkte.</p>
}

<button (click)="page.set(page() - 1)" [disabled]="page() === 1">Zurück</button>
<span>Seite {{ page() }} von {{ pages() }}</span>
<button (click)="page.set(page() + 1)" [disabled]="page() === pages()">Weiter</button>

Filter in der URL

Filter, die nur in Signals liegen, verschwinden beim Reload und lassen sich nicht teilen. Leg sie in den Query-String — /catalog?q=pro&cat=audio — und die URL wird zum Zustand: Ein Link öffnet dieselbe Ansicht, und Zurück kehrt zur vorigen Ansicht zurück, statt die Seite zu verlassen.

LiveWo die Filter leben: im Speicher oder in der Adressleiste
/catalog

65 Ergebnisse · Telefon, Telefon Mini, Telefon Air

Browserverlauf
  1. /catalog
Link zu dieser Ansicht

Wer diesen Link öffnet, sieht genau das, was im Link steht — nicht mehr.

Tippe in jedem Modus ein paar Buchstaben, ändere die Kategorie und nutze dann Zurück, Neu laden und Link öffnen.

Nur mit Signals verlässt Zurück den Katalog, und Neu laden leert ihn. Jede Änderung in den Verlauf zu schieben behebt das, macht Zurück aber zu einem Rückgängig für jeden Tastendruck. Der übliche Kompromiss: den aktuellen Verlaufseintrag ersetzen, während der Nutzer tippt, und für klare Entscheidungen wie eine Kategorie einen neuen hinzufügen.

// app.config.ts: provideRouter(routes, withComponentInputBinding())

export class Catalog {
  private readonly router = inject(Router);

  // ?q=…&cat=… kommen als Inputs an; die URL ist die Quelle der Wahrheit
  readonly q = input('');
  readonly cat = input<Category | 'all'>('all');

  search(text: string) {
    // Tippen: den aktuellen Verlaufseintrag ersetzen, nicht einen pro Taste hinzufügen
    this.update({ q: text || null }, true);
  }

  pickCategory(cat: Category | 'all') {
    this.update({ cat: cat === 'all' ? null : cat }, false); // ein echter Schritt: Zurück kehrt hierher zurück
  }

  private update(queryParams: Params, replaceUrl: boolean) {
    // null entfernt einen Parameter: Standardwerte bleiben aus der URL
    this.router.navigate([], { queryParams, queryParamsHandling: 'merge', replaceUrl });
  }
}

Mit withComponentInputBinding() kommen Query-Parameter als Inputs der Komponente an; zurückgeschrieben werden sie mit router.navigate() und queryParamsHandling: 'merge'. Halte die URL kurz, indem du Standardwerte weglässt, wie es das Lab tut.

Wenn die Liste riesig wird

Ab ein paar tausend Zeilen ist das Rendern der Engpass, nicht das Filtern: Rendere mit Virtual Scroll nur, was auf dem Bildschirm ist. Liegen die Daten auf dem Server, schick die Filter als Request-Parameter und lass httpResource neu laden, wenn sie sich ändern.

Häufige Stolperfallen

  • Das Array des Signals an Ort und Stelle sortieren. list.sort() verändert es. Kopiere zuerst ([...list] oder toSorted()), sonst arbeitet der nächste Filter auf einer umsortierten Quelle.
  • Die gefilterte Liste in einem Signal speichern. Dann muss jedes Steuerelement daran denken, sie zu aktualisieren. Leite sie mit computed ab.
  • „Seite 5 von 2“. Die Seite wurde nicht zurückgesetzt, als sich die Filter änderten. Nimm linkedSignal.
  • Ein Verlaufseintrag pro Tastendruck. Nimm replaceUrl: true, solange der Nutzer tippt.
  • track $index bei einer sortierbaren Liste. Jedes Sortieren rendert jede Zeile neu und verliert Fokus und Eingaben.

Spickzettel

Zustand                ein Signal pro Steuerelement: query, category, sort, page
abgeleitet             filtered → sorted → visible, jedes ein eigenes computed()
Reihenfolge            zuerst filtern, weniger sortieren, zuletzt ausschneiden
lazy                   ein computed, das niemand liest, läuft nie
Seite zurücksetzen     linkedSignal({ source: () => [Filter…], computation: () => 1 })
nie verändern          toSorted() / [...list].sort(); das Array des Signals bleibt, wie es war
Suche                  normalize('NFD') + Kleinbuchstaben; localeCompare(b, locale) für Namen
Rendering              @for (… ; track p.id), nie track $index bei einer sortierbaren Liste
URL                    ?q=&cat=&sort=; withComponentInputBinding(); Standardwerte weglassen
Verlauf                replaceUrl beim Tippen, push für echte Schritte (Kategorie, Seite)
riesige Listen         Virtual Scroll fürs Rendering; httpResource, wenn der Server filtert

Kap. 03 · 0 von 8 abgeschlossen

Lektion abgeschlossen?

Markiere sie, dann erscheint sie auf deiner Karte: im Inhaltsverzeichnis und auf der Startseite.

Wird automatisch markiert, sobald du die ganze Lektion gelesen hast.

  1. signal() und computed()
  2. effect() — wann ja, wann nein
  3. linkedSignal() — editierbarer abgeleiteter Zustand
  4. resource, rxResource, httpResource
  5. debounced() — verzögerte Signals
  6. Listen: suchen, filtern, sortieren, blättern
  7. Observables von null an
  8. Signals ↔ RxJS
Deine ganze Karte ansehen

Alle 75 Seiten · tippen zum Filtern

  • 01Was ist neu in Angular 21 & 22Alle wichtigen Änderungen in v21 und v22 in Kürze, mit Link zur Seite, die sie jeweils erklärt.Start
  • 01Deine erste App, Schritt für SchrittEine Leseliste, von einer leeren Komponente bis zur fertigen App — Signals, @for, Inputs und Outputs, ein Service und ein Formular, Schritt für Schritt.Start
  • 01Schnelle Entscheidungen„Wohin damit?“, „Signal oder Observable?“, „Shared oder Feature?“ — kurze Antworten auf Alltagsfragen.Start
  • 01Angular-Interviewfragen60 echte Interviewfragen für Junior, Mid und Senior, mit der passenden Antwort, der Nachfrage und den Warnsignalen. Dazu ein Probeinterview.Start
  • 02Standalone & BootstrapWie eine App ohne NgModule startet: bootstrapApplication, app.config.ts, imports in der Komponente.Moderne Grundlagen
  • 02Data Binding & EventsInterpolation, Property- und Attribut-Bindings, Events mit $event und Tastenfiltern und wie [( )] aufgebaut ist — was in das DOM geht und was zurückkommt.Moderne Grundlagen
  • 02Control Flow: @if, @for, @switchDie Block-Syntax, die *ngIf/*ngFor/ngSwitch ersetzt, mit track, @empty und Exhaustive Checks.Moderne Grundlagen
  • 02@let und die neuen Template-AusdrückeLokale Variablen mit @let, Arrow Functions, Spread, Regex, instanceof, Kommentare in Tags.Moderne Grundlagen
  • 02@defer — Lazy Loading in TemplatesSchwere Komponenten nur laden, wenn sie gebraucht werden: Trigger, Prefetch, Placeholder, Loading, Error.Moderne Grundlagen
  • 02Class- & Style-BindingsWarum [class.x] und [style.x] ngClass und ngStyle abgelöst haben (mit automatischer Migration ab v21).Moderne Grundlagen
  • 02Komponenten-Styles & Kapselung:host, die drei Kapselungsmodi, Theming mit CSS-Variablen und warum ::ng-deep der letzte Ausweg ist.Moderne Grundlagen
  • 02Pipes: wann und wiePure vs. Impure Pipes, eigene Pipes und wie du zwischen Pipe, computed() und Methode wählst.Moderne Grundlagen
  • 03signal() und computed()Die reaktiven Grundbausteine: beschreibbarer Zustand, abgeleiteter Zustand, Gleichheit, untracked und Regeln zur Immutability.Signals & Reaktivität
  • 03effect() — wann ja, wann neinMit Signals synchronisierte Seiteneffekte: localStorage, Logging, imperative APIs. Und ihre Stolperfallen.Signals & Reaktivität
  • 03linkedSignal() — editierbarer abgeleiteter ZustandEin Signal, das sich zurücksetzt, wenn sich seine Quelle ändert, das du aber auch manuell setzen kannst.Signals & Reaktivität
  • 03resource, rxResource, httpResourceAsynchrone Daten als Signals: status, value, error, reload, automatischer Abbruch. Stabil seit v22.Signals & Reaktivität
  • 03debounced() — verzögerte SignalsDie „Debounce“-Variante eines Signals, ohne RxJS. Perfekt für die Suche.Signals & Reaktivität
  • 03Listen: suchen, filtern, sortieren, blätternEine Kette von computed-Signals, die nur neu berechnet, was sich geändert hat — mit den Filtern in der URL, damit ein Link dieselbe Ansicht öffnet.Signals & Reaktivität
  • 03Observables von null anWas ein Observable ist, subscribe und unsubscribe, die Operatoren, die du jede Woche brauchst, cold vs. hot — und wann ein Signal reicht.Signals & Reaktivität
  • 03Signals ↔ RxJStoSignal, toObservable, takeUntilDestroyed, outputFromObservable — und wann RxJS weiterhin die richtige Wahl bleibt.Signals & Reaktivität
  • 04input() und output()Inputs als Signals (required, transform, alias) und typisierte Outputs. Daten nach unten, Events nach oben.Komponenten: Kommunikation
  • 04model() — Two-Way-BindingBanana-in-a-Box [( )] mit einer einzigen API. Wann du es nutzt und wann input + output besser ist.Komponenten: Kommunikation
  • 04viewChild & contentChildQueries als Signals: viewChild, viewChildren, contentChild, contentChildren, die Option read.Komponenten: Kommunikation
  • 04Lifecycle & DestroyRefWelche Hooks in der Signals-Ära noch zählen, afterNextRender, DestroyRef und typisiertes ngOnChanges.Komponenten: Kommunikation
  • 04Content Projectionng-content mit select, mehrere Slots, Standardinhalt und die Falle der bedingten Projektion.Komponenten: Kommunikation
  • 04ng-template & ngTemplateOutletTemplates als Werte: Render Props in Angular, typisierter Kontext und Anpassen von Komponenten.Komponenten: Kommunikation
  • 05Smart vs. DumbContainer vs. Presentational: wer den Zustand hält, wer nur anzeigt und wie du die beiden sauber trennst.Komponenten-Design
  • 05Generische Komponenten <T>Eine korrekt typisierte DataTable<T> oder Select<T>, mit Templates für Zellen.Komponenten-Design
  • 05Dynamische KomponentenNgComponentOutlet, createComponent mit inputBinding/outputBinding und ein Dashboard, das aus einer Konfiguration gebaut wird.Komponenten-Design
  • 05Direktiven & Host-KompositionAttribut-Direktiven, die host: {}-Metadaten und die Directive Composition API (hostDirectives).Komponenten-Design
  • 05Eigene Formular-ControlsFormValueControl (Signal Forms) vs. ControlValueAccessor: eine Sternebewertung, in beiden Varianten.Komponenten-Design
  • 05Change DetectionOnPush ist ab v22 der Standard, zone.js entfällt ab v21. Was das Rendering auslöst und wie du dir nicht die Finger verbrennst.Komponenten-Design
  • 06inject() & @Service()Der neue @Service()-Decorator ab v22, inject() vs. Konstruktor und der Injection-Kontext.Dependency Injection
  • 06Provider & die Injector-HierarchieRoot vs. Route vs. Komponente, useClass/useValue/useFactory/useExisting und die Modifier optional/self/skipSelf.Dependency Injection
  • 06InjectionToken & provideX()Typisierte Konfiguration, provideFeature()-Funktionen, makeEnvironmentProviders und Initializer.Dependency Injection
  • 06injectAsync() — Lazy ServicesLade einen schweren Service erst, wenn du ihn brauchst, mit Prefetch im Leerlauf.Dependency Injection
  • 07Ordnerstrukturcore / shared / features, was in welchen Ordner gehört und wie ein Feature von innen aussieht.Architektur der Anwendung
  • 07Shared vs. FeatureWann du eine Komponente nach Shared verschiebst und (vor allem) wann NICHT. Eine konkrete Checkliste.Architektur der Anwendung
  • 07Interfaces & ModelleInline-Interface oder eigene Datei? DTO vs. Domänenmodell, type vs. interface, wohin damit.Architektur der Anwendung
  • 07State Management mit SignalsEinfache Signal-Stores, Fassaden, lokaler vs. globaler Zustand und wann du NgRx brauchst.Architektur der Anwendung
  • 07Styleguide & NamensgebungDie aktuellen offiziellen Konventionen: Dateinamen ohne Suffixe, protected, readonly, Reihenfolge der Member.Architektur der Anwendung
  • 07Barrels, Aliase & Grenzenindex.ts, Pfad-Aliase, die öffentliche API eines Features und Abhängigkeitsregeln, die sich automatisch prüfen lassen.Architektur der Anwendung
  • 07Fehler: @boundary & ErrorHandlerDer neue @boundary-Block ab v22.2, der globale ErrorHandler, HTTP-Fehler und Fehler aus resource.Architektur der Anwendung
  • 08Modernes Routing & Lazy LoadingloadComponent, Child Routes, Parameter als Inputs und Parameter-Vererbung (neuer Standard in v22).Routing
  • 08Guards & ResolvercanActivate, canMatch, canDeactivate und resolve als Funktionen, mit Redirects über UrlTree / RedirectCommand.Routing
  • 09Signal Forms — die GrundlagenFormulare auf Basis von Signals: form(), [formField], schemabasierte Validierung. Stabil seit v22.Formulare
  • 09Signal Forms — fortgeschrittenEigene und feldübergreifende Validierung, async/HTTP mit Debounce, dynamische Listen, disabled/hidden, wiederverwendbare Schemas.Formulare
  • 09Typisierte Reactive FormsTypisierte FormGroup, nonNullable, FormArray — und wie sie neben Signal Forms bestehen.Formulare
  • 10HttpClient, Interceptors & die API-SchichtHttpClient ohne Setup (v21), Fetch als Standard (v22), funktionale Interceptors und eine API-Schicht mit DTO-Mapping.HTTP & Daten
  • 11Performance — eine ChecklisteWas wirklich zählt: OnPush + Signals, track, @defer, Lazy Routes, Bilder, Bundles und Hydration.Qualität & Performance
  • 11Testen mit VitestVitest ist ab v21 der Standard-Runner. TestBed, Komponenten mit Signals, Services, HTTP und Harnesses.Qualität & Performance
  • 11DevTools: ein Blick in deine AppChrome DevTools und Angular DevTools Schritt für Schritt: was jedes Panel zeigt, mit Übungen, die auf dieser Website funktionieren.Qualität & Performance
  • 11Angular AriaHeadless, barrierefreie Komponenten, die du nach Belieben stylst: Tabs, Accordion, Menü, Listbox...Qualität & Performance
  • 12SSR, Prerendering & Render ModesWann auf dem Server gerendert wird, wann beim Build und wann nur im Browser: RenderMode pro Route, app.routes.server.ts und die echten Kosten.SSR & Hydration
  • 12Hydration: Event Replay & inkrementellWie der Browser das Server-HTML übernimmt, ohne es neu zu rendern: vollständige Hydration, Event Replay, @defer (hydrate on …) und Mismatch-Fehler.SSR & Hydration
  • 12Servertauglicher Codewindow gibt es auf dem Server nicht: PLATFORM_ID, afterNextRender, DOCUMENT, TransferState, der HTTP-Cache und PendingTasks.SSR & Hydration
  • 13Micro FrontendsWann es sich lohnt, eine App in mehrere Deployments aufzuteilen und wann es nur Komplexität ist: Native Federation, Module Federation, iframes, Web Components.Architektur im großen Maßstab
  • 13Web Components mit Angular ElementscreateCustomElement: eine Angular-Komponente, die überall als HTML-Tag nutzbar ist, plus Kommunikation zwischen Apps über Events und BroadcastChannel.Architektur im großen Maßstab
  • 13Monorepo, Bibliotheken & GrenzenEin Workspace mit mehreren Apps und Bibliotheken: ng generate library, Nx, Secondary Entry Points, Publishing und Abhängigkeitsregeln.Architektur im großen Maßstab
  • 13Hexagonale Architektur (Ports & Adapters)Eine Domäne ohne Angular, Ports als abstrakte Klassen und austauschbare Adapter: HTTP, localStorage oder In-Memory, ohne die UI anzufassen.Architektur im großen Maßstab
  • 14Signals unter der HaubeDer reaktive Graph: Producer und Consumer, Push-Pull, warum computed lazy und glitch-frei ist, das Diamond-Problem und wann Effects laufen.Fortgeschrittene Reaktivität
  • 14Fortgeschrittenes RxJS: Operatoren höherer OrdnungswitchMap, mergeMap, concatMap und exhaustMap an einem Live-Diagramm, dazu Retry mit Backoff, shareReplay und wie du Leaks vermeidest.Fortgeschrittene Reaktivität
  • 14NgRx SignalStoreState Management im großen Stil auf Signals: withState, withComputed, withMethods, rxMethod, Entities und Hooks — und wann ein einfacher Store reicht.Fortgeschrittene Reaktivität
  • 14Zustandsautomaten mit SignalsKeine unmöglichen Zustände mehr: ein typisierter Automat auf Signals, mit Übergängen, Guards und einem Live-Zustandsdiagramm.Fortgeschrittene Reaktivität
  • 15WebSockets: Echtzeit, die das Netz überstehtEin typisierter Socket als Signals: Reconnect mit Backoff und Jitter, Heartbeat, ein Postausgang im Offline-Modus und SSR-Sicherheit.Echtzeit & offline
  • 15Optimistische Updates & RollbackEine sofortige UI, die ehrlich bleibt: Snapshot und Rollback, Antworten in falscher Reihenfolge, Idempotenzschlüssel.Echtzeit & offline
  • 15Offline-first: Service Worker & CachingDer Angular Service Worker: Caching-Strategien, Update-Hinweise und ein Postausgang für Änderungen, die offline entstehen.Echtzeit & offline
  • 16Web WorkersSchwere Berechnungen, ohne die UI zu blockieren: ein echter Worker in der Seite, Message Passing und wann es sich nicht lohnt.Fortgeschrittene UI & Performance
  • 16Riesige Listen: Virtual Scroll100.000 Zeilen ohne Ruckeln: CDK Virtual Scroll, itemSize, trackBy und die Alternativen (Paginierung, Infinite Scroll).Fortgeschrittene UI & Performance
  • 16Moderne Animationen & View Transitionsanimate.enter und animate.leave statt des veralteten @angular/animations, CSS-Transitions und View Transitions bei der Navigation.Fortgeschrittene UI & Performance
  • 16Memory Leaks finden und behebenSubscriptions, Timer und Listener, die ihre Komponente überleben – wie du sie in den DevTools findest und schließt.Fortgeschrittene UI & Performance
  • 17Sicherheit: XSS, Sanitizing & CSPWas Angular automatisch gegen XSS tut, wann bypassSecurityTrust gefährlich wird, dazu CSP mit Nonce, Trusted Types und XSRF.Sicherheit & Globalisierung
  • 17Authentifizierung: Tokens & RefreshEin Interceptor, der das Token anhängt, bei 401 einmal erneuert und die wartenden Requests wiederholt — dazu, wo du das Token aufbewahrst.Sicherheit & Globalisierung
  • 17OAuth 2.1 & OpenID Connect mit PKCEDer Authorization-Code-Flow mit PKCE Schritt für Schritt: Verifier und Challenge, State und Nonce, das ID-Token und warum ein BFF sicherer ist.Sicherheit & Globalisierung
  • 17Internationalisierung (i18n)$localize, das i18n-Attribut, ICU plural/select, ein Build pro Sprache vs. Übersetzungen zur Laufzeit und Formatierung nach Locale.Sicherheit & Globalisierung