Die Fragen, die du dir zehnmal am Tag stellst — mit einer kurzen Antwort und einem Link zur Seite, die sie ausführlich erklärt. Suche nach einem Wort oder filtere nach Kategorie.
Die Prinzipien hinter allen Antworten
- So nah wie möglich an der Verwendung
Typen, Komponenten und Zustand bleiben neben dem Code, der sie nutzt; du hebst sie erst an, wenn ein neuer Konsument auftaucht.
- Eine einzige Quelle der Wahrheit
Was sich berechnen lässt, wird abgeleitet (
computed), nicht gespeichert. - Das einfachste Werkzeug, das das Problem löst
@switchvor dynamischen Komponenten, ein Signal-basierter Service vor NgRx, Duplikation vor der falschen Abstraktion. - Immutability
Neue Referenzen für neue Daten — Signals und OnPush hängen davon ab.
Fragen und Antworten
41 von 41 Fragen
Komponenten
7Ist meine Komponente Smart oder Dumb?
Wenn sie Stores / APIs / den Router injiziert → Smart (Seite oder Container). Wenn sie alles über Inputs erhält und Outputs emittiert → Dumb. Geroutete Seiten sind Smart; den Rest hältst du so weit wie möglich Dumb.
Smart vs. DumbWann mache ich sie generisch (<T>)?
Wenn du schon 2–3 Verwendungen mit DEMSELBEN Verhalten auf unterschiedlichen Daten hast (Tabelle, Select, Liste) und die API keine Fachbegriffe enthält. Sonst bleibt sie spezifisch.
Generische Komponenten <T>Wann mache ich sie dynamisch?
Nur wenn du zur Compile-Zeit nicht weißt, welche Komponente erscheint (Config, CMS, Plugins, Dashboard). Für 2–5 bekannte Varianten nimm @switch.
Dynamische Komponenteninput + output oder model()?
model() für „Steuer“-Werte (Toggle, Slider, aktiver Tab). input + output, wenn die Elternkomponente entscheiden/validieren muss oder das Event eine Bedeutung hat (save, delete).
model() — Two-Way-Bindingng-content oder ng-template?
ng-content für statischen Inhalt, der einmal angezeigt wird. ng-template, wenn der Inhalt lazy erzeugt, wiederholt werden oder Daten (Kontext) erhalten soll.
Content ProjectionKomponente oder Direktive?
Direktive, wenn du einem bestehenden Element nur Verhalten hinzufügst (Tooltip, Autofokus). Komponente, wenn du eigenes Markup oder eigene Styles hast.
Direktiven & Host-KompositionProjektion oder Inputs für Inhalte?
Inputs, wenn die Komponente das Aussehen bestimmt (Konsistenz). Projektion, wenn die Elternkomponente freies Markup braucht (Dialoge, Karten).
Content ProjectionArchitektur
7Komponente nach shared verschieben?
Nur wenn sie JETZT in 2+ Features genutzt wird, keine Fachbegriffe enthält, keine Daten injiziert und überall gleich funktioniert. Sonst lebt sie in features/x/ui.
Shared vs. FeatureInterface inline oder in eigener Datei?
Nur von einer Datei genutzt → inline. Input-/Output-Typ → aus der Komponentendatei exportiert. Von mehreren Dateien eines Features genutzt → features/x/models. Zwischen Features → die öffentliche API des Besitzers.
Interfaces & ModelleEigenes DTO neben dem Modell?
Ja, wenn die API andere Konventionen nutzt, du sie nicht kontrollierst oder die UI abgeleitete Felder hat. Nein, bei einfachem CRUD mit bereits sauberen Typen.
Interfaces & ModelleWas kommt in core?
Dinge, die einmal auf Anwendungsebene oder als Infrastruktur gebraucht werden: Auth, Layout (Shell), ErrorHandler, Interceptors, übergreifende Services.
OrdnerstrukturDarf ich ein Feature aus einem anderen importieren?
Am besten nicht. Kommuniziere über die URL, einen Store in core oder shared. Wenn es unvermeidbar ist: nur über die öffentliche API (index.ts) des anderen Features.
Barrels, Aliase & GrenzenBarrel (index.ts) überall?
Nein. Nur an der Grenze eines Features bzw. einer Bibliothek, als öffentliche API. Im Inneren importierst du Dateien direkt.
Barrels, Aliase & GrenzenEnum oder String-Union?
Union + as-const-Objekt. Einfacher, tree-shakable, leicht in Templates zu iterieren.
Interfaces & ModelleState & Daten
7signal, computed oder linkedSignal?
signal = unabhängiger Zustand. computed = abgeleitet, read-only. linkedSignal = abgeleitet, aber editierbar (eine Auswahl, die sich zurücksetzt, ein Entwurf für ein Input).
linkedSignal() — editierbarer abgeleiteter ZustandWann nutze ich effect()?
Nur für Effekte nach außen: localStorage, Logging, imperative Bibliotheken, das DOM. Niemals, um ein anderes Signal zu setzen (→ computed / linkedSignal).
effect() — wann ja, wann neinSignal oder Observable?
Signal für angezeigten Zustand. Observable für Event-Streams über die Zeit (Websocket, Drag, komplexe Operatoren). Die Brücke: toSignal / toObservable.
Signals ↔ RxJSWie lade ich Daten vom Server?
Reaktives Lesen → httpResource (oder resource / rxResource). Schreiben (POST/PUT/DELETE) → HttpClient, danach die Resource aktualisieren bzw. neu laden.
resource, rxResource, httpResourceWo halte ich den Zustand?
So weit unten wie möglich: Komponente → Feature-Store (Provider an Route/Seite) → global (@Service in root). Teilbare Filter → die URL.
State Management mit SignalsBrauche ich NgRx?
Meistens nicht: Ein Service mit Signals reicht. NgRx SignalStore, wenn du Konventionen/Plugins willst; NgRx Store, wenn du ein Action-Log und Time-Travel brauchst.
State Management mit SignalsDebounce auf einem Signal?
debounced(sig, 300) (v22, experimental). In Signal Forms: die Regel debounce() oder die Option debounce von validateHttp.
debounced() — verzögerte SignalsTemplate
5Methode, Pipe oder computed im Template?
computed für Berechnungen, die zur Komponente gehören; eine reine Pipe für wiederverwendbare Formatierung; eine Methode nur für Triviales (sie läuft bei jedem Rendering).
Pipes: wann und wieWas gebe ich bei track in @for an?
Eine stabile ID (track item.id). $index nur für statische Listen. Identität (track item) nur, wenn die Objekte nicht neu erzeugt werden.
Control Flow: @if, @for, @switchngClass oder [class]?
[class.x] / [class] — nativ, ohne Import, schneller. Migration: ng g @angular/core:ngclass-to-class.
Class- & Style-BindingsWann @defer?
Schwerer Inhalt oder Inhalt unterhalb des sichtbaren Bereichs (Charts, Kommentare, Editoren). Nicht für den Hauptinhalt (LCP).
@defer — Lazy Loading in TemplatesWie viel Logik gehört ins Template?
Einfache Ausdrücke und @let für Teilausdrücke. Geschäftsregeln und Berechnungen auf großen Listen → computed.
@let und die neuen Template-AusdrückeDI
5@Service() oder @Injectable()?
Neuer Code in v22: @Service() (automatisch bereitgestellter Singleton, nur inject()). @Injectable, wenn du DI über den Constructor nutzt oder ältere Versionen unterstützen musst.
inject() & @Service()Wo stelle ich den Service bereit?
In root, wenn der Zustand die Navigation überleben muss. An Route/Seite für Feature-Zustand. An der Komponente für eine Instanz pro Komponente (Wizard, Editor).
Provider & die Injector-HierarchieKlasse oder InjectionToken?
Klasse, wenn du Logik/Methoden hast. InjectionToken für Werte: Config, URLs, Funktionen, Plugins (multi).
InjectionToken & provideX()Interface für den Service (IUserService)?
Nein. Brauchst du mehrere Implementierungen oder Mocks: eine abstrakte Klasse als Token, mit @Service({ factory }) für die Standardimplementierung.
inject() & @Service()Schwerer Service, selten genutzt?
injectAsync(() => import(...)) mit prefetch: onIdle (v22).
injectAsync() — Lazy ServicesFormulare & Routing
6Signal Forms oder Reactive Forms?
Neue Formulare in v22 → Signal Forms. Bestehende Reactive-Formulare bleiben; du migrierst schrittweise mit SignalFormControl / compatForm.
Signal Forms — die GrundlagenEigenes Control: FormValueControl oder CVA?
FormValueControl für Signal Forms (ein model() + optionale Inputs). ControlValueAccessor für Reactive / Template-driven.
Eigene Formular-ControlsResolver oder httpResource?
Resolver für kleine, zwingend nötige Daten. httpResource + Skeleton für Listen und Dashboards (sofortige Navigation).
Guards & ResolvercanMatch oder canActivate?
canMatch für gesperrte Bereiche (lädt den Chunk nicht herunter). canActivate für Prüfungen beim Betreten einer Route, die für alle existiert.
Guards & ResolverEigene Route oder Zustand in der Seite?
Eine Route, wenn der Screen einen eigenen Link braucht (teilbar, Zurück-Button). Lokaler Zustand für Dialoge, Dropdowns und flüchtige Schritte.
Modernes Routing & Lazy LoadingWie lese ich Route-Parameter?
withComponentInputBinding() + input() in der gerouteten Komponente. Kein ActivatedRoute und kein subscribe.
Modernes Routing & Lazy LoadingQualität
4Warum aktualisiert sich die UI nicht?
Fast sicher: Ein einfaches Feld wurde asynchron geändert (setTimeout, subscribe) in einer zoneless/OnPush-App, oder ein Objekt wurde mutiert. Wechsle zu Signals und immutablen Updates.
Change DetectionWo behandle ich Fehler?
Vorhersehbare → lokal (resource.error()). Übergreifende (401/500) → Interceptor. Rendering-Fehler in einem Bereich → @boundary. Der Rest → globaler ErrorHandler.
Fehler: @boundary & ErrorHandlerWas teste ich, und wie?
Stores und Mapper: Unit-Tests, ohne DOM. Dumb-Komponenten: createComponent + Bindings. Seiten: Fake-Store + HttpTestingController. Abläufe: E2E.
Testen mit VitestSind meine eigenen Komponenten barrierefrei?
Baue sie auf Angular Aria (headless) auf: Tastatur, Fokus und korrektes ARIA; das Styling bleibt deine Sache.
Angular Aria