从 runOutsideAngular 上下文调用 ChangeDetectorRef.detectChanges。可以吗?
Call ChangeDetectorRef.detectChanges from runOutsideAngular context. Is it ok?
可以从 NgZone.runOutsideAngular
上下文调用 ChangeDetectorRef.detectChanges
吗?我有 angular 应用程序通过 WebSocket
接收数据。 Websocket 数据流非常密集,因此我将其包装成 NgZone.runOutsideAngular
。各种服务订阅 websocket 数据,处理它并报告它们自己的事件 (Observables
)。它们在 angular 区域外触发。 Angular 组件订阅它们并在事件处理程序(观察者)中调用 ChangeDetectorRef.detectChanges
。在大多数情况下,这可以正常工作。但在某些情况下,它会带来麻烦:ngFor 可能会在 angular 区域之外创建新的 elements/components。此类组件的事件处理程序将触发超大 angular。
我知道我可以将它们包装到 NgZone.run
调用中,但这会导致我想避免的全局变化检测。
更新 1:
我创建示例来演示该问题:
https://stackblitz.com/edit/angular-5-change-detection-in-runoutsideangular-context
添加一些项目,然后尝试使用 x
按钮将其删除。
事实上,你不应该 运行 ChangeDetectorRef.detectChanges
在 angular 区域之外,因为如果在检查期间创建任何组件,这些组件将在 angular 区域之外,不会处理普通事件。
作为我的问题的解决方案,我在短时间内(250 毫秒)累积事件,然后在单个 NgZone.run
调用中处理它们。
可以从 NgZone.runOutsideAngular
上下文调用 ChangeDetectorRef.detectChanges
吗?我有 angular 应用程序通过 WebSocket
接收数据。 Websocket 数据流非常密集,因此我将其包装成 NgZone.runOutsideAngular
。各种服务订阅 websocket 数据,处理它并报告它们自己的事件 (Observables
)。它们在 angular 区域外触发。 Angular 组件订阅它们并在事件处理程序(观察者)中调用 ChangeDetectorRef.detectChanges
。在大多数情况下,这可以正常工作。但在某些情况下,它会带来麻烦:ngFor 可能会在 angular 区域之外创建新的 elements/components。此类组件的事件处理程序将触发超大 angular。
我知道我可以将它们包装到 NgZone.run
调用中,但这会导致我想避免的全局变化检测。
更新 1:
我创建示例来演示该问题:
https://stackblitz.com/edit/angular-5-change-detection-in-runoutsideangular-context
添加一些项目,然后尝试使用 x
按钮将其删除。
事实上,你不应该 运行 ChangeDetectorRef.detectChanges
在 angular 区域之外,因为如果在检查期间创建任何组件,这些组件将在 angular 区域之外,不会处理普通事件。
作为我的问题的解决方案,我在短时间内(250 毫秒)累积事件,然后在单个 NgZone.run
调用中处理它们。