0Pricing
Angular Academy · 课时

AfterView 与 AfterContent 钩子

在视图和内容初始化后运行逻辑。

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

视图与内容

Angular 将组件的视图(组件自身的模板)与通过 ng-content 投影到组件中的内容区分开来。两者会触发不同的生命周期钩子。

AfterViewInit

AfterViewInit 生命周期钩子会在组件视图及其子视图完全初始化后运行一次。这是访问视图子项的合适时机。

import { AfterViewInit } from "@angular/core";

export class DemoComponent implements AfterViewInit {
  ngAfterViewInit(): void {
    console.log("view ready");
  }
}

访问 ViewChild

对模板元素的 @ViewChild 引用会在 ngAfterViewInit 中可靠可用,但在此之前不可用。

@ViewChild("input") input!: ElementRef;

ngAfterViewInit() {
  this.input.nativeElement.focus();
}

AfterViewChecked

AfterViewChecked 生命周期钩子会在每次检查组件视图后运行。它触发得很频繁,因此其中的工作应尽量精简。

ngAfterViewChecked() {
  // runs after each view check
}

AfterContentInit

AfterContentInit 生命周期钩子会在通过 ng-content 投影的内容初始化后运行一次。

import { AfterContentInit } from "@angular/core";

export class CardComponent implements AfterContentInit {
  ngAfterContentInit() {
    console.log("projected content ready");
  }
}

访问 ContentChild

请使用 @ContentChild 查询投影内容。该引用会在 ngAfterContentInit 中可用。

@ContentChild(HeaderComponent) header!: HeaderComponent;

ngAfterContentInit() {
  console.log(this.header);
}

AfterContentChecked

AfterContentChecked 生命周期钩子会在每次检查投影内容后运行。与视图检查钩子一样,它会频繁触发。

完整的钩子顺序

对于包含输入和内容的组件,顺序为:ngOnChanges、ngOnInit、ngDoCheck、ngAfterContentInit、ngAfterContentChecked、ngAfterViewInit、ngAfterViewChecked。

// init sequence:
// OnChanges -> OnInit -> DoCheck
// -> AfterContentInit -> AfterContentChecked
// -> AfterViewInit -> AfterViewChecked

ExpressionChangedAfterChecked 错误

在 ngAfterViewInit 中更改绑定数据,可能会触发著名的 ExpressionChangedAfterItHasBeenCheckedError。请延迟此类更新以避免该错误。

ngAfterViewInit() {
  // defer to next tick to avoid the error
  setTimeout(() => this.ready = true);
}

使用 ViewChildren

@ViewChildren 会返回包含多个匹配元素或组件的 QueryList,并在 ngAfterViewInit 中准备就绪。

@ViewChildren(ItemComponent) items!: QueryList<ItemComponent>;

ngAfterViewInit() {
  console.log(this.items.length);
}

选择合适的钩子

请使用 AfterView 钩子处理您自己的模板,使用 AfterContent 钩子处理投影内容。一次性设置时优先使用 Init 变体,仅在必要时使用 Checked 变体。

快速检查

测试您对视图之后和内容之后钩子的理解。

回顾

AfterContent 钩子会针对投影内容触发,AfterView 钩子会针对组件自身的视图触发。Init 变体只运行一次,Checked 变体则在每个周期运行。请使用它们安全地访问 @ViewChild 和 @ContentChild。

常见问题解答

「AfterView 与 AfterContent 钩子」课时是免费的吗?

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

「AfterView 与 AfterContent 钩子」这节课中我会学到什么?

在视图和内容初始化后运行逻辑。 你通过在浏览器中直接运行的动手代码来练习 Angular Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Angular Academy 需要有经验吗?

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

「AfterView 与 AfterContent 钩子」课时需要多长时间?

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

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

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

此课程中的所有课时

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