在 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的责任(如另一个答案所解释)。

09-25 19:56
查看更多