【发布时间】:2017-11-22 16:52:24
【问题描述】:
【问题讨论】:
-
文档有什么不清楚的地方吗?
-
不,先生,文档很棒,但我只需要验证我对生命周期挂钩的理解。
【问题讨论】:
这是我从Angular.io 文档中了解到的。它可以帮助你。
【讨论】:
您提供的草图有些正确。供您参考,我尝试实现每个钩子。为了以防万一确定它们的发生点,我将它们中的每一个都记录到了控制台。
供您参考,下面是我的控制台的屏幕截图,因为我允许我的应用程序一个接一个地加载并遵循每个生命周期。
这是第一次加载页面时的控制台。
因此,在此生命周期中调用的组件具有自己的功能:
1)构造函数:类实例化时调用的默认方法。
2)ngOnChanges:在创建新组件时执行,当与 @Input 绑定的属性之一发生更改时,它也是唯一在调用时接受参数的钩子作为 SimpleChanges。
3)ngOnInit:在组件初始化后调用。这不允许组件在 DOM 上可见。这在构造函数之后运行。
4)ngDoCheck:在变更检测运行时运行。如果没有变化,它也会运行,即使它只是一个发生的事件,以防万一,以确保是否有一些变化。 (例如:它会在按钮单击事件之后运行,而不管它是否正在改变蚂蚁) 5)ngAfterContentInit:在内容(ng-content)被投影到视图后调用。
6)ngAfterContentChecked:在检查每个投影内容后调用。
7)ngAfterViewInit:在组件视图(和子视图)初始化后调用。
8)ngAfterViewChecked:每次检查视图(和子视图)时调用。
在下图中,当我单击左上角的链接“食谱书”导航栏标题时查找控制台:
我们可以清楚地看到“ngDoCheck”被调用,然后是“ngAfterContentChecked”,最后是“ngViewChecked”。如果您注意到 'ngAfterContentInit' 和 'ngViewInit' 仅在内容最终投影到视图时才在开始时调用。它们与发生的相应变化无关。
9)ngOnDestroy:当我们通常使用 if 条件并相应地渲染组件时调用。这主要是在对象被角度破坏之前调用的。
请参阅下图并查找当我单击“销毁第一个组件”按钮时消失的配方信息卡:
这里 'ngOnDestroy' 被调用,然后是 'ngDoCheck' 和其他后续钩子。这将使循环再次被调用,但被破坏的内容不会被渲染。 (仅供参考,这里我刚刚使用了一种拼接方法来破坏其中一个呈现的内容)
如果需要,我也可以提供代码,希望这可以帮助您和其他人了解 Angular 中生命周期钩子的功能。 :)
附:请忽略该页面截图上的其余元素。
【讨论】:
ngOnChanges() 不是在 constructor 之后调用的,而是在更改检测运行并且更改检测更新为 @Input() 之后调用。
运行更改检测时还会调用 ngDoCheck()。
在第一次调用 ngOnChanges() 之后调用ngOnInit()。
【讨论】:
ngOnChanges() 将被调用。 ngOnChanges() 与构造函数无关。
@Input()s,则不应调用ngOnChanges()(虽然尚未验证我自己)。