我在具有嵌套*ngFor*ngFor组件(组件A)中使用了一个大型数组。

组件B初始化一个注册文档mousemove事件处理程序的jquery插件,我正在使用this.zone.runOutsideAngular初始化插件,并且在回调中调用this.ref.detectChanges(),因为我需要更新组件内mousemove上的UI B.

组件A不是组件B的子代。

一旦提供了组件A,更改检测就会变得非常缓慢。数组不会更改,并且我对组件A使用ChangeDetectionStrategy.OnPush策略,但是当我在组件B内触发ref.detectChanges()时,在组件A上调用了ngDoCheck,并且在mousemove上看到了明显的颠簸。

有没有一种方法可以告诉angular完全忽略组件A中的大量项目,并让我处理何时应更新UI?我以为使用ChangeDetectionStrategy.OnPush可以满足我的需要,但是我尝试从组件A中删除所有@Input(),并且每次在组件B中调用this.ref.detectChanges()时,它仍然会触发ngDoCheck,很明显,这是非常慢。

我可以滚动浏览项目列表,没有问题,但是正是在组件B的detectChanges内触发mousemove时才引起问题。我知道我可以手动更新DOM,但我认为这只是一个解决方法,因为它只能解决mousemove上的问题,而不会解决更改检测缓慢的问题。

最佳答案

this.ref.detach()要将检测器从树上完全移开,应停止检查。然后,您仍然可以调用detectChanges手动进行操作,并调用reattach将其恢复在线状态。

除非您确实需要跟踪每个mousemove,否则也许还要对mousemove进行反跳(rxjs debounceTime())可能会有所帮助?

如果还没有进行另一种优化,则将trackBy: yourTrackByFn添加到ngFor(s)。

关于javascript - Angular 变化检测缓慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49448399/

10-12 01:06