Javascript 角度2 ChangeDetectionStrategy.OnPush触发器NGAFTERVIEW在输入未更改时检查

Javascript 角度2 ChangeDetectionStrategy.OnPush触发器NGAFTERVIEW在输入未更改时检查,javascript,angular,Javascript,Angular,我使用的是OnPush策略,根据这一点,如果输入没有变化,就不需要检查组件的模板。 但在我的示例中,当我单击触发器按钮时,输入没有改变,在这种情况下,ngAfterViewChecked钩子仍在运行。我错过了什么 import {Component, NgModule, Input, ChangeDetectionStrategy} from '@angular/core' import {BrowserModule} from '@angular/platform-browser' @Com

我使用的是OnPush策略,根据这一点,如果输入没有变化,就不需要检查组件的模板。 但在我的示例中,当我单击触发器按钮时,输入没有改变,在这种情况下,ngAfterViewChecked钩子仍在运行。我错过了什么

import {Component, NgModule, Input, ChangeDetectionStrategy} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'

@Component({
  selector: 'cmp',
  template: `
    <h1>{{data.name}}</h1>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class Cmp {
  @Input() data;

  ngOnChanges() {
    console.log('ngOnChanges');
  }

  ngAfterViewChecked() {
    console.log('view checked');
  }
}

@Component({
  selector: 'my-app',
  template: `
    <div>
      <cmp [data]="data"></cmp>
      <button (click)="trigger()">trigger</button>
      <button (click)="change()">Change</button>
    </div>
  `,
})
export class App {
  constructor() {
    this.data = {
      name: 'Angular'
    }
  }

  trigger() {

  }

  change() {
    this.data = {
      name: 'Angular2'
    };
  }
}

@NgModule({
  imports: [ BrowserModule ],
  declarations: [ App, Cmp ],
  bootstrap: [ App ]
})
export class AppModule {}
从'@angular/core'导入{Component,NgModule,Input,ChangeDetectionStrategy}
从“@angular/platform browser”导入{BrowserModule}
@组成部分({
选择器:“cmp”,
模板:`
{{data.name}
`,
changeDetection:ChangeDetectionStrategy.OnPush
})
出口级Cmp{
@输入()数据;
ngOnChanges(){
console.log('ngOnChanges');
}
ngAfterViewChecked(){
console.log('view checked');
}
}
@组成部分({
选择器:“我的应用程序”,
模板:`
触发
改变
`,
})
导出类应用程序{
构造函数(){
此参数。数据={
名称:“角度”
}
}
触发器(){
}
更改(){
此参数。数据={
名称:“Angular2”
};
}
}
@NGD模块({
导入:[BrowserModule],
声明:[应用程序,Cmp],
引导:[应用程序]
})
导出类AppModule{}

您没有遗漏任何内容。当父级
changeDetectionStrategy
OnPush
时,您对
ngafterview checked
的期望是正确的,子树组件不会调用它


当前存在一个问题,触发生命周期回调似乎不是唯一的问题,因为实际上已经进行了一些检查。

请参见它在Cmp上被调用,并且不应该。是的,它不应该用于
Cmp
。这实际上是一个报告的bug,但我澄清了它不会发生在子树组件上。