Angular 6:为什么Next的结果没有立即可见?

时间:2019-08-17 10:16:02

标签: angular rxjs observable subject

这更多是一个理论问题,因为我手头没有代码,但是我认为仍然可以解决。

我有一个服务(MsgService),负责为组件提供msg-s。当我使用类似于此方法的一种方法从组件之一更新/设置服务的msg-s时:

myMethod(data) {
        this.myMethodSubject.next(data);
    }

新消息msg-s并不遥远,只有在刷新页面后才能看到。我想看到在所有组件(已订阅)和视图上立即调用next的结果,但是我需要刷新一次页面以使结果可见。可能是什么原因呢?或者更笼统地说-在什么情况下Next和订阅的结果明显消失了?

(顺便说一句:我正在调用从NgOnInit获得msg-s的订阅方法,我应该把它放在其他地方吗?)

编辑:我对其中一个组件的订阅看起来像这样:

ngOnInit() { this.msgService.getMsgParams().subscribe(data => { this.params = data; }); 

this.msgService.getMsgs (this.params.category, this.params.price, this.params.title).subscribe(data => this.msgs = data); 
}

到目前为止,我还没有退订,这和问题有关吗?

1 个答案:

答案 0 :(得分:1)

由于以下原因,使用 async 订阅的组件视图将不会更新。

  • 视图不使用async管道来显示可观察对象的值。
  • 订阅者未使用markForCheck()将视图标记为脏视图

由于以下原因,共享服务无法将数据传输到组件。

  • 该服务正在使用Subject,并且在订阅组件之前,发射的值会丢失。尝试改用BehaviorSubject()ReplaySubject()
  • 该服务不是单例,并且发出值的服务是与组件预订不同的实例。尝试使用@Injector({provideIn:'root"})以确保它是单例。

这是人们问上述问题的主要原因。还有其他原因可能导致您的数据未更新,但这些原因与rxjs无关。假设这是一个可观察到的问题,那么我将检查以上内容是否可以解决您的问题。