Agent-skills-standard angular-rxjs-interop
Bridge Observables and Signals using toSignal and toObservable in Angular. Use when converting between RxJS Observables and Angular Signals. (triggers: toSignal, toObservable, takeUntilDestroyed, rxjs angular)
install
source · Clone the upstream repo
git clone https://github.com/HoangNguyen0403/agent-skills-standard
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/HoangNguyen0403/agent-skills-standard "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/angular/angular-rxjs-interop" ~/.claude/skills/hoangnguyen0403-agent-skills-standard-angular-rxjs-interop && rm -rf "$T"
manifest:
skills/angular/angular-rxjs-interop/SKILL.mdsource content
RxJS Interop
Priority: P1 (HIGH)
Principles
- Async to Sync: Use toSignal(observable$, { initialValue: defaultValue }) from @angular/core/rxjs-interop to convert Observables (HTTP, Events) to Signals for template rendering. Call in injection context (class field or constructor). toSignal auto-unsubscribes on component destroy. Provide initialValue to avoid
.undefined - Sync to Async: Use toObservable(this.query) when you need RxJS operators (debounceTime, switchMap, distinctUntilChanged) on Signal. Then wrap back with toSignal() if rendering.
- Auto-Unsubscribe:
automatically unsubscribes.toSignal - Cleanup: Use takeUntilDestroyed() for manual subscriptions in injection contexts. For use outside, inject(DestroyRef) and call
.takeUntilDestroyed(destroyRef)
Guidelines
- HTTP Requests:
- GET:
->http.get<User[]>(...).pipe(catchError(() => of([])))
. Use in templates as {{ users() }}.toSignal(..., { initialValue: [] }) - Consider httpResource() for simpler reactive HTTP in newer versions.
- POST/PUT: Trigger explicit subscribe() or lastValueFrom().
- Race Conditions: Handle async loading states.
requirestoSignal
or handlesinitialValue
.undefined
Anti-Patterns
- No manual subscribe in templates: Use
for Observables rendered in templates.toSignal() - No BehaviorSubject for state: Replace with
+signal()
for RxJS interop.toObservable() - No global takeUntil: Use
scoped to injection context. Never use global Subject with takeUntil — it leaks if Subject never completed.takeUntilDestroyed()