我有这样的主题服务;
private subject = new Subject<any>();
sendMessage(message: any) {
this.subject.next(message);
}
clearMessage() {
this.subject.next();
}
getMessage(): Observable<any> {
return this.subject.asObservable();
}
从父组件
提供消息 注意:我的父子组件通过router-outlet
private getMerchantDetail() {
let data = {
Id: this.merchantId,
}
this.merchantsService.getMerchants(data)
.then((res) => {
// console.log(res)
if (res.Success) {
this.merchant = res.Data[0];
this.merchantListDetailService.sendMessage(res.Data[0]); -> here
}
})
.catch((err) => { })
}
然后订阅所有子组件的数据;
ngOnInit() {
this.merchantSubscribe = this.merchantListDetailService.getMessage()
.subscribe(merchant => {
console.log(merchant)
this.merchant = merchant;
this.getMerchantPaymentChannels();
})
}
ngOnDestroy() {
this.merchantSubscribe.unsubscribe();
}
问题:
当一个子组件最初在重新加载的页面上打开时,一切都很好。但是,当我更改子组件的选项卡,并再次重新访问最初打开的子组件时,它不会获得订阅的数据。但ngOnInit
功能再次起作用。 getMessage() in service
也有效。只有子组件订阅回调不会再次获取数据。
答案 0 :(得分:1)
这是一个有点老问题,但我遇到了同样的问题。我通过使用BehaviorSubject而不是Subject来解决这个问题。我的理解是,BehaviorSubject将会记住&#34;先前设定的值,但主题不会。
当您订阅主题时,它只会听取更改,但如果没有,则不会发生任何事情。当父级为主题设置下一个值时,它将发送消息,但不保留有关其发送内容的任何信息。而且,由于您只是使用标签,因此该父级会发送一次,而这就是它。你的孩子得到第一个&#34;改变&#34;但由于更改标签时父母没有任何变化,因此不会发送另一条消息。
我很有可能误解了这一切是如何工作的,但是当我从Subject转到BehaviorSubject时,我必须做的唯一真正的区别就是为BehaviorSubject设置了一个初始值。
private subject = new BehaviorSubjectSubject<any>('');
sendMessage(message: any) {
this.subject.next(message);
}
clearMessage() {
this.subject.next('');
}
getMessage(): BehaviorSubject<any> {
return this.subject;
}
此外,我将返回类型更改为BehaviorSubject并删除了asObservable。
初始化子级时,它将具有空值(或者您设置初始BehaviorSubject的任何值),但是当父级设置下一个值时,它将获取更改,并且BehaviorSubject也将保留该值。因此,当您更改选项卡时,无论它返回到该值多少次。
我不知道是否有这样做的缺点,但现在似乎对我有用。如果发生变化或者我找到了更好的方法,我会更新。
答案 1 :(得分:0)
我认为你的子组件中需要一个函数来调用服务中的getMessage,或者需要通过@Input装饰器传递从父组件获得的消息或数据