我们的 Angular 应用程序中有许多组件需要每秒定期显示每个组件独有的新值(倒计时、时间戳、经过的时间等)。最自然的方法是创建使用 RxJStimer
和interval
工厂函数的 observables。但是,这些会在整个应用程序的每个间隔触发 Angular 更改检测,次数与调用间隔函数的次数一样多。如果页面上有几十个组件,这会触发整个应用程序每秒或时间段数十次的更改检测,从而产生很大的性能开销。
到目前为止,我尝试了两种方法来解决这个问题。任何一个的好答案都会非常有帮助 - 理想情况下两者都是。我想避免手动触发更改检测,而是依赖从 Observables 发出的新值,并让异步管道/OnPush 更改检测策略负责触发更改检测。如果这不可能,我想了解原因。
- 有什么方法可以禁用或阻止 RxJS
timer
或interval
函数触发 Angular 更改检测?使用 NgZonezone.runOutsideAngular(() => this.interval$ = interval(1000) ... )
似乎不会这样做。StackBlitz 示例:https ://stackblitz.com/edit/angular-zo5h39 - 或者,如果我使用 RxJS
Subject
结合setInterval
调用 inside创建一个 Observable 流zone.runOutsideAngular
,为什么当从主题发出新值时不会为子组件触发更改检测?StackBlitz 示例:https ://stackblitz.com/edit/angular-yxdjgd