ngondestroy example component angular rxjs observable angular-services

example - ondestroy angular 6



Angular 4+ ngOnDestroy() en servicio-destruir observable (4)

Crea una variable en tu servicio

subscriptions: Subscriptions[]=[];

Empuje cada uno de sus suscribirse a la matriz como

this.subscriptions.push(...)

Escribir un método dispose()

dispose(){ this.subscriptions.forEach(subscription =>subscription.unsubscribe())

Llame a este método desde su componente durante ngOnDestroy

ngOnDestroy(){ this.service.dispose(); }

En una aplicación angular, tenemos un gancho de ciclo de vida ngOnDestroy() para un componente / directiva y usamos este gancho para cancelar la suscripción de los observables.

Quiero borrar / eliminar observables que se crean en un servicio @injectable() . Vi algunas publicaciones que decían que ngOnDestroy() se puede usar en un servicio.

Pero, ¿es una buena práctica y la única forma de hacerlo y cuándo se llamará? Alguien por favor aclarar.


Prefiero este takeUntil(onDestroy$) habilitado por operadores pipables. Me gusta que este patrón sea más conciso, más limpio, y claramente transmite la intención de matar una suscripción tras la ejecución del gancho del ciclo de vida de OnDestroy .

Este patrón funciona tanto para servicios como para componentes que se suscriben a observables inyectados. El siguiente código esqueleto debería brindarle suficientes detalles para integrar el patrón en su propio servicio. Imagine que está importando un servicio llamado InjectedService ...

import { InjectedService } from ''where/it/lives''; import { Injectable, OnDestroy } from ''@angular/core''; import { Observable } from ''rxjs/Rx''; import { takeUntil } from ''rxjs/operators''; import { Subject } from ''rxjs/Subject''; @Injectable() export class MyService implements OnDestroy { private onDestroy$ = new Subject<boolean>(); constructor( private injectedService: InjectedService ) { // Subscribe to service, and automatically unsubscribe upon `ngOnDestroy` this.injectedService.observableThing().pipe( takeUntil(this.onDestroy$) ).subscribe(latestTask => { if (latestTask) { this.initializeDraftAllocations(); } }); } ngOnDestroy() { this.onDestroy$.next(true); this.onDestroy$.complete(); }

El tema de cuándo / cómo darse de baja se cubre ampliamente aquí: Angular / RxJs ¿Cuándo debo darme de baja de `Suscripción`


Solo para aclarar: no es necesario destruir los Observables solo las suscripciones hechas a ellos.

Parece que otros han señalado que ahora también puedes usar ngOnDestroy con los servicios. Enlace: OnDestroy


OnDestroy gancho del ciclo de vida de OnDestroy está disponible en los proveedores. Según los documentos:

Gancho de ciclo de vida que se llama cuando se destruye una directiva, tubería o servicio.

Aquí hay un example :

@Injectable() class Service implements OnDestroy { ngOnDestroy() { console.log(''Service destroy'') } } @Component({ selector: ''foo'', template: `foo`, providers: [Service] }) export class Foo { constructor(service: Service) {} ngOnDestroy() { console.log(''foo destroy'') } } @Component({ selector: ''my-app'', template: `<foo *ngIf="isFoo"></foo>`, }) export class App { isFoo = true; constructor() { setTimeout(() => { this.isFoo = false; }, 1000) } }

Tenga en cuenta que en el código anterior, el Service es una instancia que pertenece al componente Foo , por lo que se puede destruir cuando se destruye Foo .

Para los proveedores que pertenecen al inyector raíz, esto sucederá en la destrucción de la aplicación, esto es útil para evitar pérdidas de memoria con múltiples bootstraps, es decir, en las pruebas.

Cuando un proveedor del inyector principal está suscrito en el componente hijo, no se destruirá en el componente destruir, es responsabilidad del componente darse de baja en el componente ngOnDestroy (como explica otra respuesta).