Prefer `toSignal()` for an observable consumed by the template. It subscribes in the component's injection context and automatically unsubscribes when the component is destroyed. ```ts import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; import { toSignal } from '@angular/core/rxjs-interop'; @Component({ selector: 'app-user-feed', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: ` @for (user of users(); track user.id) { <p>{{ use...
Scanned 9/5/2026
Install to Claude Code
npx -y skills add HoangNguyen0403/agent-skills-standard --skill angular-components --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Angular Components?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/hoangnguyen0403-angular-components-ef9bb1c8)More formats (shields.io, HTML) on the badges page.
# Avoiding subscription memory leaks
Prefer `toSignal()` for an observable consumed by the template. It subscribes in the component's injection context and automatically unsubscribes when the component is destroyed.
```ts
import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
import { toSignal } from '@angular/core/rxjs-interop';
@Component({
selector: 'app-user-feed',
standalone: true,
imports: [],
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
@for (user of users(); track user.id) {
<p>{{ user.name }}</p>
} @empty {
<p>No users.</p>
}
`,
})
export class UserFeedComponent {
private readonly userService = inject(UserService);
readonly users = toSignal(this.userService.users$, { initialValue: [] });
}
```
If an imperative side effect genuinely requires `subscribe()`, bind its lifetime with `takeUntilDestroyed()`:
```ts
import { DestroyRef, inject } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
export class EventConsumerComponent {
private readonly eventService = inject(EventService);
private readonly destroyRef = inject(DestroyRef);
constructor() {
this.eventService.events$
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((event) => this.handleEvent(event));
}
private handleEvent(event: EventPayload): void {
// Perform the required imperative side effect here.
}
}
```
The `async` pipe is another safe template option. Do not leave a raw `subscribe()` unmanaged; use `toSignal()`, the `async` pipe, `takeUntilDestroyed()`, or an equivalent `DestroyRef` cleanup. Keep the component standalone and OnPush, and reserve `effect()` for intentional signal side effects rather than replacing ordinary derived state with subscriptions.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!