我的服务类别中有非常简单的代码:
userContext$ = this.http.post<UserContext>(this.userContextService, {}).pipe(
shareReplay(1),
tap((val: UserContext) => (this.userContext = val))
);
这被两次调用,首先在页眉中,然后在正文中:
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class HeaderComponent{
userContext$ = this.userContextService.userContext$;
第二次:
export class PortfolioComponent {
userContext$ = this.userContextService.userContext$;
但是这似乎不起作用,在“网络”选项卡中,我始终有2个呼叫,即使我进行Console.log,它也会被记录两次:
在某些时候它运行良好,但是其他一些修改使它搞砸了。
感谢您的帮助。
先生,
想通过解释来进一步解决问题,问题出在我的服务实例上。
[基本上,userContext是一个单例类(具有对providerIn:根的装饰器),并且直接在PortfolioComponent(PC)内部调用,以某种方式(PC),它也在服务类中,而该类也没有全局作用域,因此如果将其标为PC,则它是提供者:[PC服务等级]。这迫使cli在每次PC调用它时都创建一个userContext的新实例。
我通过在PC服务类中移动userContext调用来解决它,如下所示:
providers: [PortfolioService],
})
export class PortfolioComponent {
welcomeTitle: string = lables.welcomeTitle;
active = 1;
userId$ = this.portfolioService.userId$;
holdingData$ = this.portfolioService.holdingData$;
userContext$ = this.portfolioService.userContext$;
userAnnouncements$ = this.portfolioService.userAnnouncements$;
和在PortfolioService内部
userContext$ = this.userContextService.userContext$;
userAnnouncements$ = this.userContextService.userAnnouncements$;
constructor(
private http: HttpClient,
private userInfoService: UserInfoService,
private userContextService: UserContextService
) {}
我只花了6个小时和200克血(它被吸住了)就知道了。
同时感谢@AndreiGătej与我一起度过的时间。