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

时间:2017-03-24 09:00:45

标签: 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();
}

从父组件

提供消息

注意:我的父子组件通过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也有效。只有子组件订阅回调不会再次获取数据。

2 个答案:

答案 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装饰器传递从父组件获得的消息或数据