Angular 2更改选项卡后订阅并重新访问

Angular 2更改选项卡后订阅并重新访问,angular,service,observable,Angular,Service,Observable,我有这样的主题服务 private subject = new Subject<any>(); sendMessage(message: any) { this.subject.next(message); } clearMessage() { this.subject.next(); } getMessage(): Observable<any> { return this.subject.asObservable(); } 然后订阅来自

我有这样的主题服务

private subject = new Subject<any>();

sendMessage(message: any) {
    this.subject.next(message);
}

clearMessage() {
    this.subject.next();
}

getMessage(): Observable<any> {
    return this.subject.asObservable();
}
然后订阅来自所有子组件的数据

   ngOnInit() {
    this.merchantSubscribe = this.merchantListDetailService.getMessage()
      .subscribe(merchant => {
        console.log(merchant)
        this.merchant = merchant;
        this.getMerchantPaymentChannels();
      })
  }

  ngOnDestroy() {
    this.merchantSubscribe.unsubscribe();
  }
问题:
当在重新加载的页面上打开一个子组件时,一切都很好。但是,当我更改子组件的选项卡,并再次访问最初打开的子组件时,它没有得到订阅的数据。但是
ngOnInit
功能再次工作。服务中的
getMessage()也可以工作。只有子组件subscribe callback无法再次获取数据。

我认为您的子组件中也需要一个函数来调用服务中的getMessage,或者您需要通过@Input decorator传递从父组件获得的消息或数据。

这是一个有点老的问题,但我遇到了相同的问题问题我所做的是通过使用行为主体而不是主体来解决这个问题。我的理解是,BehaviorSubject将“记住”先前设置的值,但Subject不会

当你订阅一个主题时,它只是在听变化,但如果没有变化,那么什么也不会发生。当父对象为主题设置下一个值时,它将发送消息,但不保留有关发送内容的任何信息。因为你只是在使用标签,家长只发送了一次,就这样。您的孩子将获得第一个“更改”,但由于您更改选项卡时,家长没有任何更改,因此不会再发送另一条消息

很有可能我误解了所有这些是如何工作的,但当我从一个主体转到另一个行为主体时,唯一真正的区别是为行为主体设置了一个初始值

private subject = new BehaviorSubjectSubject<any>('');

sendMessage(message: any) {
    this.subject.next(message);
}

clearMessage() {
    this.subject.next('');
}

getMessage(): BehaviorSubject<any> {
    return this.subject;
}
private subject=新行为subjectsubject(“”);
sendMessage(消息:任意){
this.subject.next(消息);
}
clearMessage(){
这个。主题。下一个(“”);
}
getMessage():行为主体{
返回此.subject;
}
此外,我将返回类型更改为BehaviorSubject,并删除了asObservable

当初始化子对象时,它将有一个空值(或您将初始BehaviorSubject设置为的任何值),但当父对象设置下一个值时,它将拾取更改,BehaviorSubject也将保留该值。因此,当您更改选项卡时,无论它返回该值多少次

我不知道是否有人反对这样做,但现在对我来说似乎效果不错。如果情况发生变化,或者我找到了更好的方法,我会更新

private subject = new BehaviorSubjectSubject<any>('');

sendMessage(message: any) {
    this.subject.next(message);
}

clearMessage() {
    this.subject.next('');
}

getMessage(): BehaviorSubject<any> {
    return this.subject;
}