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

How to check if Change Detection was triggered on a component

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

如果我在 parent 组件上将 ChangeDetectionStrategy 设置为 OnPush,根据我的理解,它将 运行 仅在 parent 组件上更改检测一次,并且仅在 child 组件,即使我没有在 child 上将 ChangeDetectionStrategy 设置为 OnPush。如果 parent 组件有任何变化,我会在 parent 组件中 运行 detectChanges() 。如果 child 组件有任何变化,我 运行 detectChanges() in child 组件。

请指点是正确的方法吗?或者有什么更好的方法吗?

其次,有什么方法可以检查它是否按预期工作并且没有对特定组件执行更改检测。

使用 ChangeDetectionStrategy.OnPush,当子组件的 @Input()s 值更新时,子组件中的变化检测是 运行,接收到子组件正在侦听的事件(someEvent)="..."@HostListener(...) 或绑定到使用 | async 管道的可观察对象发出了一个事件。

到 运行 代码 @Input() 更改后,您可以将输入设为 setter 或实施 OnChanges 以便在更新时执行代码。

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

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

如果您想要 "manual" 更改检测,请使用 ChangeDetectorRef.detach() 而不是 OnPush。如果你有一个包含(大量)数据且变化非常频繁的组件,你可能想要这样做,因此你 want/need 控制变化检测运行的频率(即,何时更新视图),以便用户界面保持响应(即,浏览器不会因过多的变化检测而陷入困境)。

上述用例很少见,您可能希望使用 OnPush 来限制更改检测在您的组件上运行的频率,而不是完全手动更改检测。 @Günter 已经在他的回答中涵盖了 OnPush

is there any way to check if its working as expect and no change detection is performed on a particular component

是的,实现ngDoCheck()并在里面放一个console.log()。这个方法是called whenever change detection runs on your component/directive.