angular - Angular 变化检测是否发生在服务中?

标签 angular rxjs

我刚刚学习 Angular 变化检测。我的理解是,只要组件内部发生某些事情,Angular 就会运行变更检测。但是在服务方面呢?

假设一个服务使用 rxJs interval 每秒做一些事情(或什么都不做)。如果我理解正确的话,那是一个异步操作。那么 Angular 是否每秒运行一次更改检测并更新当前 View ?

我看到一些库在这种间隔内使用 ngZone(外部),这是一个错误吗?

最佳答案

编辑:

实际上,我将更改检测事件误认为是重新渲染组件。我做了一些更深入的研究,现在我可以说变化检测也是由服务触发的。它在整个应用程序中触发:

  1. 出现一些浏览器事件(即点击、键入)
  2. setInterval()setTimeout() 被执行
  3. 有一个使用XMLHttpRequest执行的请求

因此,根据您的顾虑,该库的创建者意识到在服务中使用 debounce 会触发变更检测。它不一定与更新模板有关,但它可能会触发它。

抱歉犯了这个错误!

原答案:

不,更改检测不会在服务中发生,因为它们没有任何模板可以重新呈现。如果您想根据某些服务的变化更新组件,您需要将该服务注入(inject)组件并共享该数据,即与 BehaviorSubject

如果您将值推送到您在组件中订阅的行为主题,这将更新该 View ,但当它未订阅时 - 它不会重新呈现。

对于您关于 ngZone 的问题 - 视情况而定。根据 Angular 文档,您可以使用它来提高应用程序的性能,但前提是它与 UI 更改或错误处理无关。

关于angular - Angular 变化检测是否发生在服务中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64574772/

相关文章:

带有 oidc-client.js 的 Angular 应用程序需要在第二个选项卡中登录

forms - 如何使用按钮添加更多输入字段 - Angular 2 动态表单

rxjs - 使用相应的 flatMap 结果压缩值

javascript - Observable - 将 2 个 Promise 转换为一个 Observable

angular - 在一个时间间隔内从 Observable.from 发出值

javascript - 在 RxJS 中制作打字计时器;跟踪打字时间

javascript - Angular 4 错误 : Cannot find control with unspecified name attribute

angular - 过滤管 Angular - 多个参数

Angular CLI 错误路径和代码 EEXIST

angular - 为什么只显示 Angular 异步管道绑定(bind)中字符串的最后一个字符?