Ecossistema Estendido
Usando RxJS com Angular

Cancelando inscrição com takeUntilDestroyed

DICA: Este guia assume que você está familiarizado com ciclo de vida de component e directive.

O operador takeUntilDestroyed, do @angular/core/rxjs-interop, fornece uma maneira concisa e confiável de cancelar automaticamente a inscrição de um Observable quando um component ou directive é destruído. Isso previne vazamentos de memória comuns com inscrições RxJS. Ele funciona de forma similar ao operador takeUntil do RxJS, mas sem a necessidade de um Subject separado.

import {Component, inject} from '@angular/core';import {takeUntilDestroyed} from '@angular/core/rxjs-interop';import {NotificationDispatcher, CustomPopupShower} from './some-shared-project-code';@Component(/* ... */)export class UserProfile {  private dispatcher = inject(NotificationDispatcher);  private popup = inject(CustomPopupShower);  constructor() {    // This subscription the 'notifications' Observable is automatically    // unsubscribed when the 'UserProfile' component is destroyed.    const messages: Observable<string> = this.dispatcher.notifications;    messages.pipe(takeUntilDestroyed()).subscribe(message => {      this.popup.show(message);    });  }}

O operador takeUntilDestroyed aceita um único argumento opcional DestroyRef. O operador usa DestroyRef para saber quando o component ou directive foi destruído. Você pode omitir esse argumento ao chamar takeUntilDestroyed em um contexto de injeção, tipicamente o constructor de um component ou directive. Sempre forneça um DestroyRef se seu código puder chamar takeUntilDestroyed fora de um contexto de injeção.

@Component(/* ... */)export class UserProfile {  private dispatcher = inject(NotificationDispatcher);  private popup = inject(CustomPopupShower);  private destroyRef = inject(DestroyRef);  startListeningToNotifications() {    // Always pass a `DestroyRef` if you call `takeUntilDestroyed` outside    // of an injection context.    const messages: Observable<string> = this.dispatcher.notifications;    messages.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(message => {      this.popup.show(message);    });  }}