从runOutsideAngular上下文中调用ChangeDetectorRef.detectChanges。还行吗?

时间:2019-02-19 16:59:07

标签: angular angular5 angular2-changedetection angular-changedetection ngzone

可以从ChangeDetectorRef.detectChanges上下文调用NgZone.runOutsideAngular吗?我有一个角度应用程序,它通过WebSocket接收数据。 Websocket数据流非常密集,因此我将其包装到NgZone.runOutsideAngular中。各种服务订阅websocket数据,对其进行处理并报告自己的事件(Observables)。它们在角度区域外触发。角组件对其进行订阅,并且在事件处理程序(观察者)中调用ChangeDetectorRef.detectChanges。在大多数情况下,这可以。但是在某些情况下,这会带来麻烦:ngFor可能会在角度区域之外创建新的元素/组件。此类组件的事件处理程序将触发超大角度。 我知道我可以将它们包装到NgZone.run调用中,但这将导致我希望避免全局更改检测。

UPDATE1: 我创建示例来演示该问题: https://stackblitz.com/edit/angular-5-change-detection-in-runoutsideangular-context 添加一些项目,然后尝试使用x按钮将其删除。

1 个答案:

答案 0 :(得分:0)

实际上,您不应该在角度区域之外运行ChangeDetectorRef.detectChanges,因为如果在该检查期间将创建任何组件,则此类组件将不在角度区域中,将无法处理常见事件。

作为解决我的问题的方法,我在短时间内(250ms)累积了事件,然后在单个NgZone.run调用中对其进行处理。