在 Angular 应用程序中,我们为组件/指令提供了ngOnDestroy()
生命周期挂钩,并使用该挂钩取消订阅可观察对象。
我想清除/破坏在@injectable()
服务中创建的可观察性。
我看到一些帖子说ngOnDestroy()
也可以在服务中使用。
但是,这是一种好的做法,并且是唯一的方法吗?何时调用它?
有人请澄清。
最佳答案
OnDestroy生命周期挂钩在提供程序中可用。
根据文档:
这是一个example:
@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
时将其销毁。对于属于根注入(inject)器的提供程序,这将在应用程序销毁时发生,这有助于避免使用多个 bootstrap (即在测试中)导致内存泄漏。
当父注入(inject)者的提供者在子组件中被订阅时,它不会在销毁组件时被销毁,这是组件负责取消订阅
ngOnDestroy
的责任(如另一个答案所解释)。