AngularAtlasAusg. 22.2

Kap. 02Moderne Grundlagen11 / 75

Komponenten-Styles & Kapselung

:host, die drei Kapselungsmodi, Theming mit CSS-Variablen und warum ::ng-deep der letzte Ausweg ist.

~0 Min. Lesezeit Offizielle Doku

Jede Komponente bringt ihr eigenes CSS mit, und standardmäßig bleibt dieses CSS in der Komponente: Eine .title-Regel in einer Komponente berührt kein .title in einer anderen. Angular erreicht das, indem es deine Selektoren beim Kompilieren der Komponente umschreibt. Der Mechanismus heißt View Encapsulation.

Wer weiß, wie das Umschreiben funktioniert, kann die Fragen beantworten, die jeder im ersten Monat stellt: warum das CSS des Elternteils nicht beim Kind ankommt, warum ein Style plötzlich auf einer anderen Seite auftaucht und wie man eine Komponente ohne ::ng-deep themefähig macht.

Warum das wichtig ist
Im Browser ist CSS von Natur aus global. Kapselung ist das, was dich in einer großen App kurze, einfache Selektoren ohne Angst schreiben lässt — solange du weißt, wo ihre Grenzen liegen.

Wo die Styles einer Komponente liegen

Inline in styles oder in einer Datei mit styleUrl. So oder so gehören sie zur Komponente: Angular fügt sie der Seite hinzu, wenn die erste Instanz erscheint, und entfernt sie, wenn die letzte zerstört wird. Globales CSS — Resets, Schriften, Design-Tokens — gehört in styles.scss, das nicht gekapselt ist.

@Component({
  selector: 'app-note',
  template: `<p class="note"><ng-content /></p>`,
  // Inline-Styles…
  styles: `
    :host { display: block; }
    .note { padding: 0.5rem 0.75rem; border-left: 3px solid var(--accent); }
  `,
  // …oder eine Datei: styleUrl: './note.css'
})
export class Note {}

Emulated: der Standard

Angular gibt jeder Komponente eine eindeutige ID und markiert ihre Elemente mit zwei Attributen: _nghost-… am Host-Element und _ngcontent-… an jedem Element ihres Templates. Dann hängt es das Attribut an jeden Teil deiner Selektoren: Aus .note wird .note[_ngcontent-ng-c123]. Deine Regeln kommen nicht aus der Komponente heraus — aber Regeln von außen kommen weiterhin hinein: Globales CSS und Komponenten ohne Kapselung wirken wie gewohnt.

/* was du schreibst */
:host { display: block; }
.note { border-left: 3px solid var(--accent); }
.list .note:hover { background: var(--surface-2); }

/* was der Browser bekommt (Emulated) */
[_nghost-ng-c123] { display: block; }
.note[_ngcontent-ng-c123] { border-left: 3px solid var(--accent); }
.list[_ngcontent-ng-c123] .note[_ngcontent-ng-c123]:hover { background: var(--surface-2); }

Die vier Modi, live

ViewEncapsulation.None lässt das Umschreiben weg: Die Styles werden global, sobald die Komponente erscheint. ShadowDom nutzt das echte Shadow DOM des Browsers, also kommt das CSS der Seite nicht hinein. ExperimentalIsolatedShadowDom (experimentell seit v21) geht noch einen Schritt weiter, wie du unten siehst.

import { ViewEncapsulation } from '@angular/core';

@Component({
  selector: 'app-embed-widget',
  // Emulated (Standard) · None · ShadowDom · ExperimentalIsolatedShadowDom
  encapsulation: ViewEncapsulation.ShadowDom,
  template: `…`,
  styles: `…`,
})
export class EmbedWidget {}
LiveDieselbe Regel in vier Kapselungsmodi

Anderswo auf der Seite

Ein Absatz mit der Klasse .enc-lab-note

Emulated (Standard)

None

Nicht eingebunden.

ShadowDom

ExperimentalIsolatedShadowDom

ModusSelektoren im BrowserWo der Style liegt
Jede Komponente hat eine Regel .enc-lab-note. Setz das Häkchen, um die None-Komponente einzubinden, und schau, welche Absätze sie erreicht — einer davon liegt in einem Shadow Root.

Die Regel der None-Komponente erreicht die Seite und die Emulated-Komponente — und überraschenderweise auch die ShadowDom-Komponente. Im Modus ShadowDom kopiert Angular die Styles der anderen Komponenten der App in jeden Shadow Root. Emulated-Selektoren passen dort nicht, globale aber schon. ExperimentalIsolatedShadowDom legt nur die eigenen Styles der Komponente in ihren Shadow Root. Bei SSR werden beide Shadow-Modi als Emulated gerendert.

Welcher Modus, wann

ModusKommen deine Styles raus?Kommen Seiten-Styles rein?Verwende ihn für
Emulatedneinjafast alles
Noneja, sie werden globaljaselten: Markup, das du nicht kontrollierst, ein globales Stylesheet als Komponente
ShadowDomneinnein — aber Angular kopiert die Styles der anderen Komponenten hineinWidgets, die in fremde Seiten eingebettet werden
ExperimentalIsolatedShadowDomneinneinvollständige Isolation (experimentell)

:host, :host() und :host-context()

Das Host-Element — <app-card> selbst — gehört zum Template des Elternteils, daher erreicht es ein normaler Selektor in der Komponente nicht. :host schon. Der Host startet mit display: inline, also brauchen die meisten Komponenten :host { display: block }. :host(.active) greift, wenn der Host eine Klasse hat; :host-context(.dark), wenn irgendein Vorfahre sie hat.

/* das Host-Element: <app-card> selbst */
:host {
  display: block; /* Hosts sind standardmäßig inline */
  border: 1px solid var(--border);
}

/* eine Variante, die die Komponente anbietet: <app-card class="compact"> */
:host(.compact) {
  padding: 0.5rem;
}

/* wenn ein Vorfahre die Klasse hat (im Modus Emulated emuliert) */
:host-context(.print) {
  border-color: black;
}

Nimm :host() für die Varianten, die eine Komponente anbietet. Angular emuliert :host-context() im Modus Emulated, aber in einem echten Shadow Root unterstützt es nur Chromium. Für Themes funktionieren CSS-Variablen überall.

Ein Kind vom Elternteil aus stylen

Die Frage, die jeder stellt: „Mein CSS wirkt nicht auf die Kindkomponente!“ Die Selektoren des Elternteils bekommen das Attribut des Elternteils, die Elemente im Kind tragen das des Kindes — sie passen also nie zusammen. Hier sind die Versuche, die man üblicherweise macht, live kompiliert.

LiveDen Kaufen-Button vom Elternteil aus umstylen
Elternteil
Hat den Button erreicht
nein
Globale Regel
nein

Jeder Teil des Selektors hat das Attribut des Elternteils bekommen. Der Button im Kind trägt das Attribut des Kindes, also passt nichts.

Du schreibst
.attempt-plain app-buy-button button {
  background: var(--bad);
}
Der Browser bekommt
—
Probier jeden Ansatz aus und vergleiche, was du schreibst, mit dem, was der Browser wirklich bekommt.

Die letzten beiden überleben Refactorings: Das Kind veröffentlicht, was sich ändern lässt, und der Elternteil nutzt nur das. ::ng-deep ist deprecated, hat aber keinen Ersatz, deshalb behält Angular es für Fälle, in denen dir das Kind nicht gehört — etwa beim Stylen einer Fremdbibliothek. Auch dann: Fang immer mit :host an. Achte auch auf die Spezifität: Im Modus Emulated zählt .buy[_ngcontent-…] im Kind wie zwei Klassen, eine Regel von außen braucht also mindestens so viel, um zu gewinnen.

/* ✗ global: aktiv auf jeder Seite, solange die Komponente existiert */
::ng-deep .mat-mdc-button { text-transform: uppercase; }

/* ✓ wenn es wirklich sein muss: nur innerhalb dieser Komponente */
:host ::ng-deep .mat-mdc-button { text-transform: uppercase; }

Themes mit CSS-Variablen

Deklariere im Kind Variablen mit Fallbacks — var(--buy-bg, var(--surface-2)) — und setze sie irgendwo darüber: in styles.scss für die ganze App, an einem Container für einen Bereich oder mit [style.--buy-bg] für eine einzelne Instanz. Der Dark Mode ist dann nur ein anderer Satz Werte.

@Component({
  selector: 'app-buy-button',
  template: `<button class="buy"><ng-content /></button>`,
  styles: `
    /* die öffentliche Styling-API: Variablen mit Fallbacks… */
    .buy {
      background: var(--buy-bg, var(--surface-2));
      color: var(--buy-fg, var(--text));
      border-radius: var(--buy-radius, 8px);
    }
    /* …und Varianten, die das Kind unterstützt */
    :host(.danger) .buy {
      --buy-bg: var(--bad-soft);
      --buy-fg: var(--bad);
    }
  `,
})
export class BuyButton {}

Was in styles.scss gehört

Resets, Schriften, Design-Tokens (Farben, Abstände und Radien als Variablen) und Styles für HTML, das nicht von deinen Komponenten gerendert wird — innerHTML aus einem CMS zum Beispiel. Alles andere gehört zu der Komponente, die es rendert.

Dynamisch gebundene Klassen und Styles behandelt Class- & Style-Bindings; wie sich Shadow DOM in einer Web Component verhält, Web Components mit Angular Elements.

Häufige Stolperfallen

  • Eine Komponente, die width und margin ignoriert. Der Host ist standardmäßig display: inline. Füg :host { display: block } hinzu.
  • ViewEncapsulation.None, um einen Selektor zu „reparieren“. Die Styles werden global und bleiben es: Sie treffen jedes Element mit dieser Klasse, solange die Komponente existiert.
  • ::ng-deep ohne :host. Dasselbe Problem, eine Regel nach der anderen.
  • Das interne Markup des Kindes stylen. Das funktioniert mit ::ng-deep, bis das Kind sein Template ändert. Bitte das Kind stattdessen um eine Variable oder eine Variante.
  • Sich bei der Isolation auf ShadowDom verlassen. Angular kopiert die Styles der anderen Komponenten in den Shadow Root. Wenn du echte Isolation brauchst, schau dir ExperimentalIsolatedShadowDom an.

Spickzettel

styles / styleUrl      das CSS der Komponente; kommt mit der ersten Instanz, geht mit der letzten
Emulated (default)     Selektoren bekommen [_ngcontent-…]; nichts geht raus, Seiten-CSS kommt weiter rein
None                   kein Umschreiben: Styles sind global, solange die Komponente existiert
ShadowDom              echter Shadow Root; Angular kopiert trotzdem die Styles der anderen Komponenten hinein
Isolated (exp. v21)    ExperimentalIsolatedShadowDom: nur die eigenen Styles der Komponente
:host                  das Host-Element; standardmäßig inline → :host { display: block }
:host(.x)              eine Variante des Hosts: <app-card class="x">
:host-context(.x)      ein Vorfahre hat .x; in einem echten Shadow Root vermeiden
::ng-deep              stoppt die Begrenzung; deprecated; immer :host ::ng-deep, nur für fremden Code
CSS variables          werden über jede Grenze vererbt: die öffentliche Styling-API einer Komponente
styles.scss            Resets, Schriften, Tokens, CMS-/innerHTML-Markup — keine Komponenten-Styles

Kap. 02 · 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. Standalone & Bootstrap
  2. Data Binding & Events
  3. Control Flow: @if, @for, @switch
  4. @let und die neuen Template-Ausdrücke
  5. @defer — Lazy Loading in Templates
  6. Class- & Style-Bindings
  7. Komponenten-Styles & Kapselung
  8. Pipes: wann und wie
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