行为主题RXJS

时间:2019-08-29 14:23:30

标签: rxjs angular7 ionic4 behaviorsubject angular-changedetection

我有此链接,可使用时间戳更改网址的结尾:

  getAvatar(channelId): BehaviorSubject<string> {
    return new BehaviorSubject(`${link}?${new Date().getTime()}`);
  }

在Avatar组件中,它是至少10个其他组件的子组件,我称之为“订阅”:

  getAvatar() {
    this.userService.getAvatar(this.channelId)
      .subscribe(res => {
        this.avatar = res;
        this.cdr.detectChanges();
        this.cdr.markForCheck();
      });
  }

OBS:我正在使用OnPush changeDetection策略

在另一个组件中,我有一个函数可以更改链接内的个人资料图片:

this.userService.changeProfilePicture(picture, this.myChannelId)
      .subscribe(
        () => {
          this.loading.hide();
          this.userService.getAvatar(this.id);
          this.screenService.showToastMessage('Foto de perfil alterada.', true);
        }

如您所见,我回想起getAvatar()函数,该函数返回BehaviorSubject以生成另一个链接,而AvatarComponent确实会检测到behaviorSubject的变化,我在做什么错了?

还有另一种方法可以调用所有AvatarComponent实例的getAvatar()函数来重新加载每个头像实例吗?

OBS2:我尝试使用of rxjs运算符,创建一个new Observable(),尝试了Subject类,所有这些似乎都没有被AvatarComponent内部的订阅所检测到

OBS3:我尝试使用@ViewChild()获取AvatarComponent并调用此this.avatarCmp.getAvatar();重新加载化身,但仅重新加载Avatar Component的一个实例

1 个答案:

答案 0 :(得分:0)

您的服务需要更像这样:

  private avatarSource = new BehaviorSubject(`${link}?${new Date().getTime()}`);
  avatar$ = this.avatarSource.asObservable();
  setAvatar(channelId): BehaviorSubject<string> {
    this.avatarSource.next(`${link}?${new Date().getTime()}`);
  }

然后您需要订阅avatar $并使用setAvatar更新