我在具有嵌套*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/