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 -> AfterViewCheckedExpressionChangedAfterChecked 错误
在 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 反馈 — 无需本地设置。
此课程中的所有课时
- ngOnInit 与初始化
- ngOnChanges 与输入变更
- ngOnDestroy 与清理
- AfterView 与 AfterContent 钩子