我有此链接,可使用时间戳更改网址的结尾:
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的一个实例
答案 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更新