angular - 角度:AfterViewInit() 与 AfterContentInit()
问题描述
我试图准确了解导致AfterViewInit()
和AfterContentInit()
生命周期钩子触发的原因。
从官方 Angular 文档中它说AfterViewInit()
Angular 在创建组件的子视图后调用
Angular 将外部内容投射到组件后的 Angular 调用
这两种说法在我看来已经几乎无法区分了。子视图与外部内容不一样吗?
举个例子: parent.component.html
<div class="parent">
<child-comp></child-comp>
</div>
其中child-comp是一个包含大量标记并且依赖于异步数据的子组件。
在parent.component.ts中,我想等到子组件完全呈现后再调用AfterViewInit()
or AfterContentInit()
。当我运行这段代码时,它会按照 Angular 所说 AfterContentInit()
的首先调用它的确切顺序发生,然后是AfterViewInit()
. 目前 child-comp 没有接收到很多数据,但最终它可以接收并且需要更长的时间来渲染(数据一旦上线就会增长)。
我现在担心的是,因为我的数据是有限的,并且通过选择一个生命周期钩子而不是另一个而加载时间如此之快,我可能不情愿地最终陷入竞争状态——一旦数据增加并且加载时间减速,这种情况就会失败。
解决方案
如果您已经开始在 Angular 中进行一些动态组件加载或手动视图创建,这将变得更有意义。
OnInit
@Input
当组件的s 和@Output
s 被解析时调用一次。
AfterViewInit
在附加组件的视图时调用。请记住,Angular 将所有视图编译为 JS 文件,而不是 html - 该框架在代码中管理模板并具有与 DOM 交互的渲染引擎。除了实际渲染组件之外,Angular 还需要递归地构建和管理关于组件绑定及其生命周期的子/父关系。子组件也需要解析它们的绑定并经历与父组件相同的渲染生命周期。简单地说,在这个钩子上@ViewChild
,@ViewChildren
将被解决——子组件将被完全初始化,并且它们的属性将可用。
AfterContentInit
有点奇怪。当组件的子视图和外部内容已附加时调用。这来自内容投影,通常是<ng-content>
标签。这是渲染器需要沿着树向下执行的另一个步骤,在将所有投影内容附加到脱节视图之前解析所有投影内容。如果您不使用模板或<ng-content>
. 在这里@ContentChild
,@ContentChildren
将得到解决。
至于您提到的竞争条件,如果您使用正确的生命周期钩子来满足需要,则无需担心——它们只是在s,之后 立即调用的钩子,并且已在组件上设置——竞争条件注入的属性不应该通过控制反转来存在变化检测(非框架因素不可承受):)@Input
@ViewChildren
@ContentChildren
推荐阅读
- documentum - 有什么方法可以限制我访问我上传的文件?
- linux - 在 dlopen-ed 库中覆盖 malloc/free
- django - 如何部署 django 后端并将前端应用程序反应到同一域
- vue.js - VueJS - 如何在 Vue Router 中为任意数量的可选参数定义路由
- flask - flask-wtf 的字段定义中的 'name' 参数有什么作用?
- ruby-on-rails - 我的 Rails 表单没有被提交或重定向
- python - 如何使用 Python (requests-html) 在网站上获取 .xls 文件的文件名
- function - 无法在关于 Iron lib 的 fn 项目中捕获动态环境
- markdown - markdown:如何添加指向 markdown 图片标题的链接
- python - 使用 python 和 OpenNI2 录制 Orbbec Astra 流