Javascript 角度变化检测速度慢

Javascript 角度变化检测速度慢,javascript,angular,ngzone,Javascript,Angular,Ngzone,我在组件(组件a)中使用了一个大数组,该组件带有嵌套的*ngFor 组件B初始化一个jquery插件,该插件注册一个文档mousemove事件处理程序,我使用this.zone.runOutsideAngular初始化插件,并在回调中调用this.ref.detectChanges(),因为我需要更新组件B内部mousemove上的UI 组件A不是组件B的子组件 一旦渲染组件A,更改检测就会变得非常慢。数组没有改变,我正在使用组件A的ChangeDetectionStrategy.OnPush策

我在组件(组件a)中使用了一个大数组,该组件带有嵌套的
*ngFor

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

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

一旦渲染组件A,更改检测就会变得非常慢。数组没有改变,我正在使用组件A的
ChangeDetectionStrategy.OnPush
策略,但是当我在组件B内部启动
ref.detectChanges()
时,组件A上调用了
ngDoCheck
,我可以看到
鼠标移动
上明显的jank声

有没有办法告诉angular完全忽略组件a中的大量项目,并允许我处理UI何时应该更新?我原以为使用
changedtectionstrategy.OnPush
可以满足我的需要,但我已经尝试从组件A中删除所有
@Input()
s,并且每当我调用
this.ref.detectChanges()
时,组件B内部仍会触发
ngDoCheck
,显然这非常缓慢

我可以滚动查看没有问题的项目列表,但正是在触发组件B上的
鼠标移动
内的
检测更改时才导致问题。我知道我可以手动更新DOM,但我认为这只是一个解决办法,因为它只解决mousemove上的jank问题,而不会解决更改检测速度慢的问题。

this.ref.detach()
要从树中完全删除检测器,应该停止检查。然后,您仍然可以调用
detectChanges
手动执行此操作,然后
重新连接
使其重新联机

也许对mousemove(rxjs debounceTime())进行去Boung也会有所帮助,除非您真的需要跟踪每个mousemove


如果您还没有进行进一步优化,请将
trackBy:yourTrackByFn
添加到ngFor中。

我已经找到了问题的根源

问题是嵌套*ngFor的组件A内部使用了一个子组件来呈现每个子项,这意味着尽管我使用了ChangeDetectionStrategy.OnPush策略,但它仍然需要对每个项进行ref检查


现在,我已经将html从子组件直接移动到组件A中,这对性能产生了巨大影响。

感谢您的回答。我忘了提到我试过分离,但没用。在*ngFor中使用'trackBy:yourTrackByFn'。这将解决您的问题,因为每当发生ChangeDetection时,它都会为该组件执行生命周期事件,这会影响性能。