【问题标题】:RxJs Subscription does not get fired in the root angular moduleRxJs 订阅不会在根角度模块中触发
【发布时间】:2018-06-15 06:28:50
【问题描述】:

我有一个组件可以监听 http 调用以显示加载器。我有 spinner 组件和一个 spinner 服务,它有一个 spinnerEvent$ Angular4 事件发射器。这是我的组件构造函数。

constructor(
    private spinnerService: SpinnerService
) {
    this.subscription = spinnerService.spinnerEvent$.subscribe((spinnerEvent: any) => this.updateSpinnerState(spinnerEvent));
    console.log(this.subscription);
}

对于 Angular 应用程序正在使用延迟加载。问题是我想将此组件添加到路由器插座下方的 app.component.html 中,但这样做时,我的订阅方法永远不会被触发。订阅按照我的日志中的定义显示。当我在子模块上放置相同的组件时,订阅开始工作。微调器组件和微调器服务都在一个已注入 app.module.ts 的共享模块中。我不确定是什么导致了订阅行为的这种差异。

【问题讨论】:

  • 当spinnerEvent$ 发出事件时,将调用您传递给subscribe(...) 的内容。 console.log(...) 在此之前执行很长时间。阅读异步执行。
  • »具有 spinnerEvent$ Angular4 事件发射器« EventEmitter 专门用于组件。您不应该使用它并手动订阅它。为此使用实际的 rxjs 主题。
  • @GünterZöchbauer 虽然应该提到可观察对象可以同步发射。它们也可以异步发射。
  • @IngoBürk 不确定您的意思。虽然可以同步发出事件,但从订阅者的角度来看,它始终是一个异步 API。只有当回调被调用时,你才会得到一个值。
  • @IngoBürk 我认为我们在同一页上,我只是认为这让初学者感到困惑而不是帮助。当一个 observable 用于调用像 HTTP 请求这样的异步代码时,它可能无法帮助解释事件是同步发出的 ;-)

标签: angular rxjs subject-observer


【解决方案1】:

当我从共享模块中移动我的微调器组件和微调器服务并在 app.module 中定义它时,这个问题得到了解决。目前正在尝试了解原因,因为我的 app.module 之前从共享模块导入了该组件。

【讨论】:

  • 所以,这是一个 DI 问题。由于应用程序中使用了延迟加载,我的根模块无法访问 SpinnerService。通过在 sharedModule 定义中使用静态方法 forRoot,我能够在根模块中提供服务。 [参考] (angular-2-training-book.rangle.io/handout/modules/…)
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 2022-07-11
  • 2021-12-22
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
相关资源
最近更新 更多