Stackblitz 示例:https ://stackblitz.com/edit/ngif-detectionchange
testToggle
由于绑定到其中的某些属性,我有可以更改其高度的组件。它有兄弟testParent
组件,它是 flex 以获取其余高度,并且它testChild
具有绑定到testParent
高度的子组件。当testParent
*ngIf 指令具有真表达式时,当testToggle
更改绑定到其高度的属性时,我得到:
错误:ExpressionChangedAfterItHasBeenCheckedError:表达式在检查后已更改。
在记录组件的生命周期钩子顺序后,我发现了一些奇怪的东西:
No ngIf used testParent has ngIf with expression true
testToggle: DoCheck testToggle: DoCheck
testParent: DoCheck testParent: DoCheck
testToggle: AfterContentChecked testParent: AfterContentChecked
testParent: AfterContentChecked testChild: DoCheck
testChild: DoCheck testChild: AfterContentChecked
testChild: AfterContentChecked testChild: AfterViewChecked
testChild: AfterViewChecked testParent: AfterViewChecked
testToggle: AfterViewChecked testToggle: AfterContentChecked
testParent: AfterViewChecked testToggle: AfterViewChecked
显然,正确的示例抛出 ExpressionChanged,因为整个testParent
周期已经结束,之前testToggle
可以更新它的绑定(这会改变它的高度,因此改变testParent
高度)。
我想知道为什么使用 ngIf 动态添加的组件在通过组件树正常继续之前完成其整个生命周期?