AngularAtlasAusg. 22.2

Kap. 16Fortgeschrittene UI & Performance70 / 75

Moderne Animationen & View Transitions

animate.enter und animate.leave statt des veralteten @angular/animations, CSS-Transitions und View Transitions bei der Navigation.

v22 ~0 Min. Lesezeit Offizielle Doku

Seit v20.2 hat Angular in @angular/core zwei neue Anweisungen: animate.enter und animate.leave. Die Animation schreibst du in CSS, wie jede andere Animation. Angular übernimmt den Teil, den CSS allein nicht kann: Es setzt eine Klasse, wenn das Element in den DOM kommt, und verzögert beim Verlassen das Entfernen des Elements, bis die Animation fertig ist. In derselben Version wurde das Paket @angular/animations (trigger, state, transition) als deprecated markiert.

Für Übergänge zwischen Seiten oder zwischen zwei Zuständen desselben Bildschirms gibt es die View Transitions API. Das ist eine Browser-API, die mit withViewTransitions() in den Router integriert ist.

Was sich geändert hat
Die neue API braucht kein separates Paket, kein provideAnimations() und keine DSL in TypeScript mehr. Animationen sind gewöhnliches CSS, vom Browser beschleunigt, und animate.leave löst den schwierigen Teil, nämlich ein Element zu animieren, das gleich verschwindet. Die v22-Dokumentation empfiehlt ausdrücklich animate.enter / animate.leave für allen neuen Code.

animate.enter und animate.leave

animate.enter="enter" fügt die Klasse enter hinzu, wenn das Element eingefügt wird (ein @if wird wahr, ein neues Element erscheint in einem @for), und entfernt sie, wenn die CSS-Animation endet. animate.leave="leave" setzt die Klasse beim Entfernen und hält das Element im DOM, bis die Animation endet. Das sind keine Direktiven, sondern Compiler-Anweisungen: Du musst sie nicht importieren und kannst sie auch als Host-Bindings verwenden.

@for (item of items(); track item.id) {
  <li animate.enter="enter" animate.leave="leave">{{ item.label }}</li>
}
LiveAnimierte Liste (echte animate.enter / animate.leave)
in der Liste: 4 · Elemente im DOM: 4
  • Apfel
  • Birne
  • Pflaume
  • Kirsche
Entferne das erste Element und beobachte „Elemente im DOM“: Während die Austrittsanimation läuft (600 ms), bleibt eines mehr stehen, dann sinkt die Zahl. Füge ein paar Elemente hinzu, um die Eintrittsanimation zu sehen.

Keyframes oder Transition

Mit @keyframes ist es einfach: Die Klasse enthält die Animation, und Angular wartet auf deren End-Event. Bei transition weist die Dokumentation auf ein Detail hin: Die Enter-Klasse stellt den Endzustand dar. Den Startzustand gibst du mit @starting-style an, sonst gibt es kein „Von“, von dem die Transition ausgehen könnte.

/* Mit transition statt keyframes: Die Klasse ist der ENDzustand, und @starting-style ist der Startzustand */
.panel { transition: opacity 250ms, transform 250ms; }
.panel-enter {
  opacity: 1;
  transform: none;
  @starting-style {
    opacity: 0;
    transform: translateY(12px);
  }
}

Die Funktionsform: volle Kontrolle

(animate.enter)="fn($event)" und (animate.leave)="fn($event)" rufen eine Methode mit einem AnimationCallbackEvent auf: target (das Element) und animationComplete(). So bindest du die Web Animations API oder Bibliotheken wie GSAP ein. Bei leave ist der Aufruf von animationComplete() Pflicht. Fehlt er, entfernt Angular das Element erst nach MAX_ANIMATION_TIMEOUT, standardmäßig 4 Sekunden.

import { AnimationCallbackEvent, Component, signal } from '@angular/core';

@Component({
  selector: 'app-toasts',
  template: `
    @for (t of toasts(); track t.id) {
      <div class="toast" (animate.enter)="slideIn($event)" (animate.leave)="slideOut($event)">{{ t.text }}</div>
    }
  `,
})
export class Toasts {
  readonly toasts = signal<Toast[]>([]);

  slideIn(event: AnimationCallbackEvent): void {
    event.target.animate([{ opacity: 0, transform: 'translateX(40px)' }, { opacity: 1, transform: 'none' }], 250);
  }

  slideOut(event: AnimationCallbackEvent): void {
    const animation = event.target.animate([{ opacity: 1 }, { opacity: 0, transform: 'translateX(40px)' }], 300);
    // PFLICHT bei leave: sonst entfernt Angular das Element erst nach MAX_ANIMATION_TIMEOUT (standardmäßig 4 s)
    animation.finished.then(() => event.animationComplete());
  }
}
LiveAnimierte Benachrichtigungen aus TypeScript (Web Animations API)
schließt sich nach 2,5 s von selbst oder per Klick
  1. Das Hook-Protokoll erscheint hier.
Zeige ein paar Benachrichtigungen an und schließe sie per Klick. Das Protokoll zeigt die Reihenfolge: leave startet die Animation, und das Element verschwindet erst nach animationComplete().

Migration von @angular/animations

Die meisten Animationen mit trigger('fade', [transition(':enter', …)]) lassen sich direkt in zwei CSS-Klassen und animate.enter / animate.leave übersetzen. Zustände (state('open')) werden zu gewöhnlichen CSS-Klassen, gebunden mit [class.open]. Beide Systeme können in einer Anwendung nebeneinander bestehen, aber nicht in derselben Komponente: Laut Dokumentation bleiben sonst Klassen an Elementen hängen, oder Knoten werden nie entfernt. Dasselbe gilt für Content Projection zwischen Komponenten, die unterschiedliche Systeme verwenden.

// VORHER — @angular/animations (deprecated seit v20.2)
@Component({
  animations: [
    trigger('fade', [
      transition(':enter', [style({ opacity: 0 }), animate('200ms', style({ opacity: 1 }))]),
      transition(':leave', [animate('200ms', style({ opacity: 0 }))]),
    ]),
  ],
  template: `@if (open()) { <div @fade>…</div> }`,
})

// NACHHER — CSS + animate.enter / animate.leave, ohne Paket und ohne provideAnimations()
@Component({
  template: `@if (open()) { <div animate.enter="fade-in" animate.leave="fade-out">…</div> }`,
  styles: `
    .fade-in  { animation: fade 200ms; }
    .fade-out { animation: fade 200ms reverse forwards; }
    @keyframes fade { from { opacity: 0; } }
  `,
})

View Transitions

Der Browser macht einen Snapshot der Seite, du änderst den DOM, und dann animiert der Browser die Differenz: standardmäßig ein Cross-Fade, und Elemente mit demselben view-transition-name „verwandeln“ sich ineinander (Position, Größe). Im Router aktivierst du das mit withViewTransitions(). Die Funktion ist in den Typen des Routers als Developer Preview markiert und hat die Optionen skipInitialTransition und onViewTransitionCreated. Außerhalb des Routers rufst du document.startViewTransition() direkt auf. In einer Zoneless-Anwendung musst du den DOM synchron im Callback aktualisieren.

import { provideRouter, withViewTransitions } from '@angular/router';

export const appConfig: ApplicationConfig = {
  providers: [
    provideRouter(
      routes,
      withViewTransitions({
        skipInitialTransition: true, // keine Animation beim ersten Laden
        onViewTransitionCreated: ({ transition }) => {
          // läuft in einem Injection-Kontext; bestimmte Navigationen kannst du überspringen:
          // if (...) transition.skipTransition();
        },
      }),
    ),
  ],
};
LiveRaster ↔ Detail mit der View Transitions API

Dein Browser unterstützt keine View Transitions: Die Änderung erfolgt sofort (Fallback).

Klicke auf eine Karte: Sie „wächst“ in das Detailpanel, weil beide denselben view-transition-name haben. Klicke auf das Detail, um zurückzukehren. In Browsern ohne Unterstützung erfolgt die Änderung sofort.

Performance und Barrierefreiheit

  • Animiere transform und opacity: Der Compositor übernimmt das, ohne Layout. width, height und top berechnen das Layout in jedem Frame neu.
  • Kurze Dauern für die UI (150–300 ms). Lange Animationen lassen die Oberfläche träge wirken.
  • Respektiere prefers-reduced-motion. Diese Seite macht das global; deshalb sind die Beispiele oben bei aktivierter Einstellung „Bewegung reduzieren“ im System fast sofort fertig.
@media (prefers-reduced-motion: reduce) {
  .enter, .leave { animation-duration: 1ms; }
  ::view-transition-group(*) { animation: none; }
}

Elemente, die in eine Liste kommen oder sie verlassen, animierst du mit animate.enter auf jeder @for-Zeile (siehe Control Flow: @if, @for, @switch). Bei sehr langen Listen animiere nur, was auf dem Bildschirm ist: Riesige Listen: Virtual Scroll. Was eine Animation kostet und wie du es misst: Performance — eine Checkliste.

Wann ja, wann nein

Verwenden
  • animate.enter / animate.leave für Elemente, die erscheinen und verschwinden: Listen, Toasts, Panels, Dialoge.
  • Die Funktionsform, wenn du JavaScript brauchst: berechnete Animationen, GSAP, Sequenzen.
  • View Transitions für Navigationen und Layout-Änderungen (Liste → Detail), mit sofortigem Fallback.
  • Reines CSS (:hover, transition) für alles, was kein Einfügen oder Entfernen betrifft.
Vermeiden
  • @angular/animations in neuem Code: Es ist deprecated. Behalte es nur dort, wo es schon existiert, bis du migrierst.
  • Animationen auf Layout-Eigenschaften in großen Listen: Sie ruckeln.
  • Animationen, die die Interaktion blockieren: Der Benutzer wartet, bis sie fertig sind, bevor er klicken kann.
  • View Transitions bei jeder kleinen Zustandsänderung: Das wird anstrengend und kostet Ressourcen.

Häufige Stolperfallen

  • animationComplete() vergessen in (animate.leave): Das Element bleibt weitere 4 Sekunden sichtbar.
  • transition ohne @starting-style bei enter: Nichts wird animiert, weil es keinen Startzustand gibt.
  • animate.leave in einer Kindkomponente, wenn der Parent entfernt wird. Die Dokumentation stellt klar, dass die Leave-Animationen von Kindern nur für Elemente im selben Template laufen. Setze animate.leave auf das Host-Element des Kindes, im Template des Parents.
  • Beide Systeme in derselben Komponente (oder über Content Projection): undefiniertes Verhalten.
  • startViewTransition ohne synchrone Aktualisierung in einer Zoneless-Anwendung: Der Browser macht den Snapshot des alten Zustands zweimal, und nichts wird animiert.

Spickzettel

ENTER/LEAVE (seit v20.2, in @angular/core — kein separates Paket)
  animate.enter="Klasse"           die Klasse wird beim Einfügen gesetzt und am Ende der Animation entfernt
  animate.leave="Klasse"           das Element bleibt im DOM, bis die Animation endet
  [animate.enter]="expr"           String, Array von Klassen, Signal
  (animate.leave)="fn($event)"     AnimationCallbackEvent: target + animationComplete() — PFLICHT bei leave
  MAX_ANIMATION_TIMEOUT            wie lange Angular auf ein unfertiges leave wartet (Standard 4 s)
CSS
  keyframes: Die Klasse enthält die Animation · transition: Klasse = Endzustand + @starting-style = Start
  animiere transform und opacity (Compositor), nicht width/height/top (Layout)
  prefers-reduced-motion — respektiere es
VIEW TRANSITIONS
  provideRouter(routes, withViewTransitions({ skipInitialTransition, onViewTransitionCreated }))  — Developer Preview
  view-transition-name: x  ·  ::view-transition-old/new(x)  ·  document.startViewTransition(cb)
@angular/animations  deprecated seit v20.2 — nur für bestehenden Code; nicht in derselben Komponente mit animate.* mischen

Kap. 16 · 0 von 4 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. Web Workers
  2. Riesige Listen: Virtual Scroll
  3. Moderne Animationen & View Transitions
  4. Memory Leaks finden und beheben
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