我试图更好地了解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
吗?
答案 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处理程序中进行了更改,则无论如何都会由于该事件而触发更改检测。