如何检查是否在组件上触发了更改检测

Nav*_*med 6 angular2-directives angular2-template angular2-changedetection angular

在我的应用程序中,我想设置手动更改检测.为此,我将ChangeDetectionStrategry设置为OnPush,每当组件发生更改时,我使用detectChanges手动运行更改检测.

如果我在父组件上将ChangeDetectionStrategy设置为OnPush,根据我的理解,它将仅在父组件上运行一次更改检测,在子组件上只运行一次,即使我没有在子组件上将ChangeDetectionStrategy设置为OnPush.如果父组件有任何更改,我在父组件中运行detectChanges().如果子组件有任何变化,我在子组件中运行detectChanges().

请建议这是正确的方法吗?还是有更好的方法吗?

其次,有没有办法检查它是否按预期工作,并且没有对特定组件执行更改检测.

Mar*_*cok 8

如果您想要"手动"更改检测,请使用ChangeDetectorRef.detach()而不是OnPush.如果您的组件(大量)数据频繁变化,您可能希望这样做,因此您希望/需要控制更改检测运行的频率(即,视图更新时)以便用户界面保持响应(即,浏览器不会因为太多的变化检测而陷入困境).

上面的用例很少见,您可能希望用来OnPush限制更改检测在组件上运行的频率,而不是一直到完全手动更改检测.@Günter OnPush的答案已经涵盖了.

有没有办法检查它是否按预期工作,并且没有对特定组件执行更改检测

是的,实施ngDoCheck()并放入console.log()其中.只要在组件/指令上运行更改检测,就会调用此方法.


Gün*_*uer 6

ChangeDetectionStrategy.OnPush,变化检测在子组件运行时的@Input()子组件的s值的更新,一个事件的子组件是听接收(someEvent)="..."@HostListener(...)或可观察到的结合使用| async发射的事件管.

要在@Input()更改时运行代码,您可以使输入成为OnChanges要在更新时执行的代码的setter或实现.

对于事件,只需在事件处理程序中调用您的代码.

对于可观察对象,您可以应用运算符.map(...),以便在发出值时执行代码.