0Pricing
Angular Academy · 课时

ngOnDestroy 与清理

在组件移除时释放资源。

ngOnDestroy 与清理 是 CoddyKit 上的免费 Angular Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Angular Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Angular Academy 课程共包含 4 节课。

为什么清理很重要

当组件从 DOM 中移除后,任何残留的订阅、计时器或事件监听器都可能导致内存泄漏。OnDestroy 钩子就是清理它们的位置。

实现 OnDestroy

实现 OnDestroy,并添加 ngOnDestroy 方法。Angular 会在组件销毁前立即调用它。

import { Component, OnDestroy } from "@angular/core";

@Component({ selector: "app-demo", template: "" })
export class DemoComponent implements OnDestroy {
  ngOnDestroy(): void {
    console.log("cleaning up");
  }
}

取消 Observable 的订阅

手动创建的订阅必须取消,以避免内存泄漏。请保存 Subscription,并在 ngOnDestroy 中调用 unsubscribe。

private sub!: Subscription;

ngOnInit() {
  this.sub = this.timer$.subscribe(t => this.tick = t);
}

ngOnDestroy() {
  this.sub.unsubscribe();
}

管理多个订阅

您可以将多个订阅收集到一个父级 Subscription 中,然后一次性取消所有订阅。

private subs = new Subscription();

ngOnInit() {
  this.subs.add(this.a$.subscribe());
  this.subs.add(this.b$.subscribe());
}

ngOnDestroy() {
  this.subs.unsubscribe();
}

takeUntil 模式

一种常见的 RxJS 模式是使用销毁 Subject 和 takeUntil,这样组件销毁时,流就会自动完成。

private destroy$ = new Subject<void>();

ngOnInit() {
  this.data$.pipe(takeUntil(this.destroy$))
    .subscribe(d => this.data = d);
}

ngOnDestroy() {
  this.destroy$.next();
  this.destroy$.complete();
}

使用 takeUntilDestroyed

现代 Angular 提供了来自 @angular/core/rxjs-interop 的 takeUntilDestroyed,它可以将流绑定到组件生命周期,无需手动清理。

import { takeUntilDestroyed } from "@angular/core/rxjs-interop";

constructor() {
  this.data$.pipe(takeUntilDestroyed())
    .subscribe(d => this.data = d);
}

async 管道替代方案

在模板中使用 async 管道可以完全避免手动订阅,因为组件销毁时它会自动取消订阅。

<p>{{ data$ | async }}</p>

清除计时器和间隔计时器

原生计时器不由 Angular 管理。请在 ngOnDestroy 中清除它们,以停止组件销毁后的回调。

private id!: number;

ngOnInit() {
  this.id = window.setInterval(() => this.tick(), 1000);
}

ngOnDestroy() {
  clearInterval(this.id);
}

移除事件监听器

如果您手动添加了 DOM 监听器,请在销毁时将其移除,以防止内存泄漏和过时的处理器继续运行。

private onScroll = () => this.handle();

ngOnInit() {
  window.addEventListener("scroll", this.onScroll);
}

ngOnDestroy() {
  window.removeEventListener("scroll", this.onScroll);
}

使用 DestroyRef 处理回调

您可以注入 DestroyRef 并注册 onDestroy 回调,这在服务或非组件上下文中很有用。

constructor(private destroyRef: DestroyRef) {
  const id = setInterval(() => {}, 1000);
  this.destroyRef.onDestroy(() => clearInterval(id));
}

什么会触发 ngOnDestroy

ngOnDestroy 会在组件因路由、类似 *ngIf 的结构型指令被移除,或其父组件被销毁时运行。

快速检查

测试您对 OnDestroy 的理解。

回顾

OnDestroy 生命周期钩子用于清理订阅、计时器和监听器。请使用 unsubscribe、takeUntil 模式、takeUntilDestroyed、async 管道或 DestroyRef 来防止内存泄漏。

常见问题解答

「ngOnDestroy 与清理」课时是免费的吗?

是的 — 「ngOnDestroy 与清理」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Angular Academy 课程的其余内容,请升级到 CoddyKit PRO。 Angular Academy 课程共包含 4 节课。

「ngOnDestroy 与清理」这节课中我会学到什么?

在组件移除时释放资源。 你通过在浏览器中直接运行的动手代码来练习 Angular Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Angular Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Angular Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「ngOnDestroy 与清理」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Angular Academy 课中编写并运行代码吗?

能。每节 Angular Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. ngOnInit 与初始化
  2. ngOnChanges 与输入变更
  3. ngOnDestroy 与清理
  4. AfterView 与 AfterContent 钩子
← 返回 Angular Academy