Javascript 角度变化检测速度慢
我在组件(组件a)中使用了一个大数组,该组件带有嵌套的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策
*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时,它都会为该组件执行生命周期事件,这会影响性能。