【问题标题】:Angular 2 ChangeDetectionStrategy.OnPush trigger ngAfterViewChecked when Inputs does not change当输入没有改变时,Angular 2 ChangeDetectionStrategy.OnPush 触发 ngAfterViewChecked
【发布时间】:2016-11-13 22:08:31
【问题描述】:

我正在使用 OnPush 策略,根据 article 如果没有输入更改,则无需检查组件的模板。 但是在我的示例中,当我单击触发按钮并且在这种情况下输入没有改变时,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 {}

【问题讨论】:

标签: javascript angular


【解决方案1】:

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

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

【讨论】:

  • 它在 Cmp 上被调用,它不应该。
  • 是的,Cmp 不应该这样。这实际上是一个报告的错误,但我澄清说子树组件不会发生这种情况。
猜你喜欢
  • 1970-01-01
  • 2017-02-09
  • 2017-09-17
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 2017-07-06
  • 2018-06-18
  • 1970-01-01
相关资源
最近更新 更多