Angular Components
Priority: P0 (CRITICAL)
Standalone & Structure
- Standalone:
standalone: true. Import all deps inimportsarray. No NgModule. (Angular 20+: standalone default.) - Smart/Dumb Split: Smart (Container) → inject services, manage state. Presentational (Dumb) → accept inputs and emit events via outputs only; no service dependencies.
- Host Bindings: Define in
host: { }on@Component(e.g.,'[class.active]': 'isActive()') — never use @HostBinding/@HostListener. - View Encapsulation: Default
Emulated. UseNonecarefully.
Signals & Change Detection
- OnPush: ALWAYS use
ChangeDetectionStrategy.OnPush. No exceptions. - Signal Inputs:
input.required<T>()orinput<T>()not@Input(). Access as functions:{{ userId() }}. UsebooleanAttribute/numberAttributetransforms. - Signal Outputs:
output<T>()(v17.3+) not@Output() EventEmitter. Two-way binding:model(). - State:
signal()local,computed()derived,effect()side effects only. - Cleanup:
toSignal()(auto-unsubscribes),takeUntilDestroyed(), orDestroyRef. Neversubscribe()without cleanup.
Control Flow
- Use
@if (condition),@for (item of items; track item.id),@switch,@empty { }instead of*ngIf/*ngFor(new control flow syntax, Angular 17+).
Anti-Patterns
- No default CD: OnPush only — default re-checks every component every event.
- No functions in templates:
{{ calculate() }}re-evaluates every cycle →computed()instead. - No manual subscribe:
asyncpipe ortoSignal. Neversubscribe()without cleanup. - No ElementRef mutation: Directives or Renderer2.
- No class inheritance: Compose with Directives and Services.