角度变化检测

时间:2019-07-24 08:09:06

标签: angular typescript angular-changedetection

我试图更好地了解ChangeDetection的工作方式,我对此有疑问。

如果我使用的是changeDetection: ChangeDetectionStrategy.OnPush,则需要在ngOnChanges生命周期挂钩上验证currentValue是否存在?还是足以验证输入是否已更改?

我可以举一个例子来更好地理解我在说什么:

因此,正如我提到的,我正在使用changeDetection: ChangeDetectionStrategy.OnPush,这是我的输入@Input() isInspectionReopened: boolean;,而ngOnChanges看起来像这样:

ngOnChanges(changes: SimpleChanges) {
  if(changes.isInspectionReopened) {
     // do something
  }
}

足以验证changes.isInspectionReopened或我需要添加changes.isInspectionReopened.currentValue吗?

1 个答案:

答案 0 :(得分:2)

SimpleChanges仅包含已更改的值,因此,如果isInspectionReopened道具未更改,则该位置会丢失。

使用ChangeDetectionStrategy.OnPush时,通常根本不应该使用ngOnChanges回调。 ChangeDetectionStrategy.OnPush仅影响逻辑,该逻辑决定何时运行更改检测。因此,当isInspectionReopened属性更改时,将触发更改检测,因为它是一个'@Input'属性,并且如果绑定到该属性,则组件html也将被更新。

但是,如果isInspectionReopened不是'@Input'属性,例如,组件从服务器加载值并更新它,则OnPush检测将无法识别该更改,这与标准变更检测。可以将{x1}管道与RxJs Observables结合使用,以强制采用OnPush策略(例如here is)进行更改检测。

此外,请记住,“ @ Input”属性仅在通过父组件的数据绑定进行更新时才触发更改检测。如果组件本身更改了“ @Input”属性值,则不会触发更改检测。

更改检测也由组件dom事件触发。例如,如果您监听click事件,并在click处理程序中进行了更改,则无论如何都会由于该事件而触发更改检测。