10

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

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

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

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

4

2 回答 2

14

如果您想要“手动”更改检测,请使用ChangeDetectorRef.detach()而不是OnPush. 如果您有一个包含(大量)数据的组件非常频繁地更改,您可能希望执行此操作,因此您希望/需要控制更改检测运行的频率(即,何时更新视图)以便用户界面保持响应(即,浏览器不会因过多的更改检测而陷入困境)。

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

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

是的,实施并在里面ngDoCheck()放一个。每当更改检测在您的组件/指令上运行时,都会调用console.log()此方法。

于 2016-09-26T18:05:18.997 回答
9

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

要在更改时运行代码,@Input()您可以将输入设置为设置器或实现OnChanges以在更新时执行代码。

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

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

于 2016-09-25T17:11:08.893 回答