Angular 6:为什么Next的结果不是立即可见的?
Angular 6: Why aren't the results of Next visible immidiately?
这更像是一个理论问题,因为我手头没有代码,但我认为它仍然可以被解决。
我有一个服务 (MsgService) 负责向组件提供 msg-s。当我使用与此类似的方法从其中一个组件发送服务的 update/set 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);
}
到目前为止,我还没有取消订阅,这与问题有关吗?
使用 async 订阅的组件视图将不会更新,原因如下。
- 视图不使用
async
管道来显示来自 observable 的值。
- 订阅者未使用 markForCheck()
将视图标记为脏
由于以下原因,共享服务无法将数据传输到组件。
- 该服务正在使用 Subject and emitted values are lost before components subscribe. Try using a BehaviorSubject() or a ReplaySubject()。
- 该服务不是单例,发出值的服务是与订阅组件不同的实例。尝试使用
@Injector({provideIn:'root"})
以确保它是单例。
这些是人们提出上述问题的主要原因。您的数据可能没有更新还有其他原因,但这些原因往往与 rxjs 无关。假设这是一个可观察到的问题,那么我会检查上面的内容以查看它是否解决了您的问题。
这更像是一个理论问题,因为我手头没有代码,但我认为它仍然可以被解决。
我有一个服务 (MsgService) 负责向组件提供 msg-s。当我使用与此类似的方法从其中一个组件发送服务的 update/set 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);
}
到目前为止,我还没有取消订阅,这与问题有关吗?
使用 async 订阅的组件视图将不会更新,原因如下。
- 视图不使用
async
管道来显示来自 observable 的值。 - 订阅者未使用 markForCheck() 将视图标记为脏
由于以下原因,共享服务无法将数据传输到组件。
- 该服务正在使用 Subject and emitted values are lost before components subscribe. Try using a BehaviorSubject() or a ReplaySubject()。
- 该服务不是单例,发出值的服务是与订阅组件不同的实例。尝试使用
@Injector({provideIn:'root"})
以确保它是单例。
这些是人们提出上述问题的主要原因。您的数据可能没有更新还有其他原因,但这些原因往往与 rxjs 无关。假设这是一个可观察到的问题,那么我会检查上面的内容以查看它是否解决了您的问题。