Хук жизненного цикла 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
? И что вы думаете, когда это вызывается, если услуга предоставляется на уровне модуляimplements OnDestroy
ни на что не влияет, но может быть добавлен для полноты картины. Он будет вызываться при уничтожении модуля, напримерappModule.destroy()
. Это может быть полезно для инициализации нескольких приложений.Создайте переменную в своем сервисе
Вставьте каждую подписку в массив как
Напишите
dispose()
методВызовите этот метод из своего компонента во время ngOnDestroy
источник
@injectables
Я предпочитаю, чтобы этот
takeUntil(onDestroy$)
шаблон был включен операторами конвейера. Мне нравится, что этот шаблон более лаконичен, более понятен и ясно передает намерение убить подписку при выполненииOnDestroy
ловушки жизненного цикла.Этот шаблон работает как для служб, так и для компонентов, подписывающихся на внедренные наблюдаемые объекты. Приведенный ниже скелетный код должен дать вам достаточно подробностей для интеграции шаблона в вашу собственную службу. Представьте, что вы импортируете сервис под названием
InjectedService
...Тема того, когда и как отказаться от подписки, подробно рассматривается здесь: Angular / RxJs Когда мне следует отказаться от подписки на подписку
источник
Уточняю - вам не нужно уничтожать,
Observables
а только сделанные на них подписки.Кажется, что другие указали, что теперь вы также можете использовать их
ngOnDestroy
со службами. Ссылка: https://angular.io/api/core/OnDestroyисточник
Осторожно при использовании токенов
Пытаясь сделать свое приложение как можно более модульным, я часто использую токены поставщика для предоставления услуги компоненту. Кажется, что их
ngOnDestroy
методы НЕ называются :-(например.
С разделом провайдера в компоненте:
Мой метод
ShopPaymentPanelService
НЕ вызывается при удаленииngOnDestroy
компонента. Я только что выяснил это на собственном горьком опыте!Обходной путь - предоставить услугу вместе с
useExisting
.Когда я это сделал, он
ngOnDispose
был вызван, как и ожидалось.Не уверен, ошибка это или нет, но очень неожиданно.
источник