Хук жизненного цикла OnDestroy доступен у провайдеров. Согласно документам:
Ловушка жизненного цикла, которая вызывается при уничтожении директивы, канала или службы.
Вот пример :
@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)
}
}
Обратите внимание, что в приведенном выше коде Service
есть экземпляр, принадлежащий Foo
компоненту, поэтому он может быть уничтожен при Foo
уничтожении.
Для провайдеров, которые принадлежат к корневому инжектору, это произойдет при уничтожении приложения, это помогает избежать утечек памяти при множественной загрузке, то есть в тестах.
Когда поставщик из родительского инжектора подписан в дочернем компоненте, он не будет уничтожен при уничтожении компонента, это ответственность компонента за отказ от подписки в компоненте ngOnDestroy
(как объясняется в другом ответе).
class Service implements OnDestroy
? И что вы думаете, когда это вызывается, если услуга предоставляется на уровне модуля