即使使用ChangeDetectionStrategy.OnPush,也会调用Angular ngDoCheck()

Mic*_*ick 4 angular2-changedetection angular

假设我有一个像这样的组件结构:

AppComponent
    HeaderComponent
    ContentComponent
        TodosComponent
            TodoComponent
Run Code Online (Sandbox Code Playgroud)

如果我设置HeaderComponent的changeDetectionChangeDetectionStrategy.OnPush和改变TodoComponent,仍然HeaderComponent的东西ngDoCheck(),ngAfterViewChecked()ngAfterContentChecked()被触发.

我错过了什么?无论如何都会触发ngDoCheck吗?如果是,如何确定ChangeDetection是否检查了组件?

Max*_*kyi 6

是的,这是正确的行为.文章如果您认为ngDoCheck您的组件正在被检查 - 请阅读本文详细解释行为.这是简短的版本.

ngDoCheck被触发正在检查的组件之前.这样做是为了允许您执行一些自定义逻辑,然后标记组件以进行检查.您知道Angular @Input通过对象引用跟踪,但您可以使用它ngDoCheck来进行自定义跟踪.这是一个简单的例子:

Component({
   ...,
   changeDetection: ChangeDetectionStrategy.OnPush
})
MyComponent {
   @Input() items;
   prevLength;
   constructor(cd: ChangeDetectorRef) {}

   ngOnInit() {
      this.prevLength = this.items.length;
   }

   ngDoCheck() {
      if (this.items.length !== this.prevLength) {
         this.cd.markForCheck();
      }
   }
Run Code Online (Sandbox Code Playgroud)

请记住,ngDoCheck仅针对策略的顶级组件触发OnPush.它不会触发这个组件的孩子.

ngAfterViewChecked即使现在检查完成,也会为组件触发正确.这也是设计的.

我强烈建议您阅读Angular中有关变化检测的所有知识,特别是Exploring the implications部分.它显示了您正在寻找的操作顺序.

另请阅读 我们为什么需要ngDoCheck.