javascript - Angular 2 ChangeDetectionStrategy.OnPush 在输入不改变时触发 ngAfterViewChecked

标签 javascript angular

我正在使用 OnPush 策略并根据此 article如果没有输入更改,则无需检查组件的模板。 但在我的示例中,当我单击触发按钮并且输入没有更改时,在这种情况下 ngAfterViewChecked Hook 仍在运行。我错过了什么?

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 {}

最佳答案

你没有错过任何东西。您对 ngAfterViewChecked 的期望是正确的,当父 changeDetectionStrategyOnPush 时,子树组件不会调用它。

目前有一个issue opened on Github而且似乎触发生命周期回调并不是唯一的问题,因为实际上进行了一些检查。

关于javascript - Angular 2 ChangeDetectionStrategy.OnPush 在输入不改变时触发 ngAfterViewChecked,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40579346/

相关文章:

angular - 根据选择值禁用 Angular Reactive 表单输入

用 !important 标志定义的 CSS 变量在 Angular 生产模式下消失

javascript - 使用 styled-components 防止组件重新渲染

javascript - 如何仅验证电子邮件的登录用户

javascript - 从数据库中将 Iframe 注入(inject) Angular 2

node.js - node dist/server.js 退出时没有错误消息

angular - 我收到 "Property ' router' does not exist on type 'SigninComponent' ."while using this.router.navigate(['/dashboard']);在 Angular 4

javascript - 向富文本编辑器的 Source 值添加一个额外的类

javascript - 无限循环中的字体颜色变化

javascript - 当页面打开时,如何将jVectorMap中的 'markerStyle'设置为 'selected'?