O gancho de ciclo de vida OnDestroy está disponível em provedores. De acordo com a documentação:
Gancho de ciclo de vida que é chamado quando uma diretiva, canal ou serviço é destruído.
Aqui está um exemplo :
@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)
}
}
Observe que no código acima Service
está uma instância que pertence ao Foo
componente, portanto, ela pode ser destruída quando Foo
for destruída.
Para provedores que pertencem ao injetor de raiz, isso acontecerá na destruição do aplicativo; isso é útil para evitar vazamentos de memória com várias inicializações, ou seja, em testes.
Quando um provedor do injetor pai é inscrito no componente filho, ele não será destruído na destruição do componente, é responsabilidade do componente cancelar a inscrição no componente ngOnDestroy
(como outra resposta explica).
class Service implements OnDestroy
? E o que você pensa quando isso é chamado se o serviço for fornecido no nível de móduloimplements OnDestroy
não afeta nada, mas pode ser adicionado para integridade. Ele será chamado quando um módulo for destruído, comoappModule.destroy()
. Isso pode ser útil para inicializações de vários aplicativos.Crie uma variável em seu serviço
Empurre cada um de seus inscritos para a matriz como
Escreva um
dispose()
métodoChame este método de seu componente durante ngOnDestroy
fonte
@injectables
Eu prefiro esse
takeUntil(onDestroy$)
padrão habilitado por operadores de tubulação. Eu gosto que esse padrão seja mais conciso, mais claro e transmita claramente a intenção de cancelar uma assinatura após a execução doOnDestroy
gancho ciclo vida.Esse padrão funciona tanto para serviços quanto para componentes que assinam observáveis injetados. O esqueleto do código abaixo deve fornecer detalhes suficientes para integrar o padrão em seu próprio serviço. Imagine que você está importando um serviço chamado
InjectedService
...O tópico de quando / como cancelar é coberto extensivamente aqui: Angular / RxJs Quando devo cancelar a assinatura de `Assinatura`
fonte
Só para esclarecer - você não precisa destruir,
Observables
apenas as assinaturas feitas a eles.Parece que outras pessoas indicaram que agora você também pode usar os
ngOnDestroy
serviços. Link: https://angular.io/api/core/OnDestroyfonte
Cuidado ao usar tokens
Ao tentar tornar meu aplicativo o mais modular possível, geralmente usarei tokens de provedor para fornecer um serviço a um componente. Parece que estes NÃO recebem seus
ngOnDestroy
métodos chamados :-(por exemplo.
Com uma seção de provedor em um componente:
Meu
ShopPaymentPanelService
NÃO tem seungOnDestroy
método chamado quando o componente é descartado. Eu descobri isso da maneira mais difícil!Uma solução alternativa é fornecer o serviço em conjunto com
useExisting
.Quando fiz isso,
ngOnDispose
foi chamado conforme o esperado.Não tenho certeza se isso é um bug ou não, mas muito inesperado.
fonte