【问题标题】:Behavior Subject RXJS行为主体 RXJS
【发布时间】:2019-08-29 14:23:30
【问题描述】:

我有这个链接可以更改带有时间戳的网址的结尾:

  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:我使用OnPushchangeDetection 策略

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

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(); 来重新加载头像,但只重新加载头像组件的一个实例

【问题讨论】:

  • 您每次都在创建一个新主题。所以当然组件不知道彼此的主题。与变更检测无关。您需要有一个他们都使用的不变主题,并在其上调用 next 方法来更新它
  • 但是如果我这样做 return of(`${link}?${new Date().getTime()}`) 它会返回一个新的 Observable 或者只向同一个 observable 发出一个新值?
  • 需要有一个可观察的/主题。如果你每次都创造一个新的,那么他们怎么会知道彼此的价值

标签: rxjs angular7 ionic4 behaviorsubject angular-changedetection


【解决方案1】:

您的服务需要更像这样:

  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 更新

【讨论】:

  • 但 URL 接收到不同的 channelId
  • 那么您需要显示该通道 ID 在您的方法中实际使用的方式。在您发布的代码中,它只是一个参数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 2017-06-02
  • 2022-01-08
相关资源
最近更新 更多