我刚刚学习 Angular 变化检测。我的理解是,只要组件内部发生某些事情,Angular 就会运行变更检测。但是在服务方面呢?
假设一个服务使用 rxJs interval
每秒做一些事情(或什么都不做)。如果我理解正确的话,那是一个异步操作。那么 Angular 是否每秒运行一次更改检测并更新当前 View ?
我看到一些库在这种间隔内使用 ngZone(外部),这是一个错误吗?
最佳答案
编辑:
实际上,我将更改检测事件误认为是重新渲染组件。我做了一些更深入的研究,现在我可以说变化检测也是由服务触发的。它在整个应用程序中触发:
- 出现一些浏览器事件(即点击、键入)
setInterval()
或setTimeout()
被执行- 有一个使用
XMLHttpRequest
执行的请求
因此,根据您的顾虑,该库的创建者意识到在服务中使用 debounce
会触发变更检测。它不一定与更新模板有关,但它可能会触发它。
抱歉犯了这个错误!
原答案:
不,更改检测不会在服务中发生,因为它们没有任何模板可以重新呈现。如果您想根据某些服务的变化更新组件,您需要将该服务注入(inject)组件并共享该数据,即与 BehaviorSubject
。
如果您将值推送到您在组件中订阅的行为主题,这将更新该 View ,但当它未订阅时 - 它不会重新呈现。
对于您关于 ngZone
的问题 - 视情况而定。根据 Angular 文档,您可以使用它来提高应用程序的性能,但前提是它与 UI 更改或错误处理无关。
关于angular - Angular 变化检测是否发生在服务中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64574772/