【发布时间】: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