El enlace del ciclo de vida de OnDestroy está disponible en los proveedores. Según los documentos:
Enlace de ciclo de vida que se llama cuando se destruye una directiva, canalización o servicio.
He aquí un ejemplo :
@Injectable()
class Service implements OnDestroy {
ngOnDestroy() {
console.log('Service destroy')
}
}
@Component({
selector: 'foo',
template: `foo`,
providers: [Service]
})
export class Foo implements OnDestroy {
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 Service
hay una instancia que pertenece al Foo
componente, por lo que puede destruirse cuando Foo
se destruye.
Para los proveedores que pertenecen a root injector, esto sucederá al destruir la aplicación, esto es útil para evitar pérdidas de memoria con múltiples bootstraps, es decir, en pruebas.
Cuando un proveedor del inyector principal está suscrito en el componente secundario, no se destruirá al destruir el componente, es responsabilidad del componente cancelar la suscripción en el componente ngOnDestroy
(como explica otra respuesta).
class Service implements OnDestroy
? ¿Y qué piensas cuando se llama a esto si el servicio se proporciona a nivel de móduloimplements OnDestroy
no afecta nada pero se puede agregar para completar. Se llamará cuando se destruya un módulo, comoappModule.destroy()
. Esto puede resultar útil para varias inicializaciones de aplicaciones.Crea una variable en tu servicio
Empuje cada uno de sus suscriptores a la matriz como
Escribe un
dispose()
métodoLlame a este método desde su componente durante ngOnDestroy
fuente
@injectables
Prefiero este
takeUntil(onDestroy$)
patrón habilitado por operadores pipables. Me gusta que este patrón sea más conciso, más limpio y transmita claramente la intención de eliminar una suscripción tras la ejecución delOnDestroy
enlace del ciclo de vida.Este patrón funciona tanto para servicios como para componentes que se suscriben a observables inyectados. El código esqueleto a continuación debería brindarle suficientes detalles para integrar el patrón en su propio servicio. Imagina que estás importando un servicio llamado
InjectedService
...El tema de cuándo / cómo cancelar la suscripción se trata ampliamente aquí: Angular / RxJs ¿Cuándo debo cancelar la suscripción de la suscripción?
fuente
Solo para aclarar: no es necesario destruir,
Observables
solo las suscripciones realizadas a ellos.Parece que otros han señalado que ahora también puede usar
ngOnDestroy
con servicios. Enlace: https://angular.io/api/core/OnDestroyfuente
Precaución si usa tokens
Al intentar hacer que mi aplicación sea lo más modular posible, a menudo utilizo tokens de proveedor para proporcionar un servicio a un componente. Parece que estos NO obtienen sus
ngOnDestroy
métodos llamados :-(p.ej.
Con una sección de proveedor en un componente:
My
ShopPaymentPanelService
NO tiene sungOnDestroy
método llamado cuando se elimina el componente. ¡Acabo de descubrir esto por las malas!Una solución alternativa es proporcionar el servicio junto con
useExisting
.Cuando hice esto,
ngOnDispose
se llamó como se esperaba.No estoy seguro de si esto es un error o no, pero es muy inesperado.
fuente