0

我试图更好地了解 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

4

1 回答 1

2

SimpleChanges仅包含更改的值,因此,如果isInspectionReopened道具未更改,则它在那里丢失。

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

但是,如果isInspectionReopened不是“@Input”属性,例如组件从服务器加载值并对其进行更新,则OnPush检测将无法识别该更改,这与标准更改检测不同。在 OnPush 策略的情况下,您可以使用带有async管道的 RxJs Observables 来强制进行更改检测,这里是一个示例。

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

变更检测也是由组件 dom 事件触发的。例如,如果您侦听单击事件,并在单击处理程序中更改某些内容,则无论如何都会因为该事件而触发更改检测。

于 2019-07-24T08:46:56.663 回答