Angular 在登录时强制刷新用户名2+;

Angular 在登录时强制刷新用户名2+;,angular,Angular,我在标题组件中有一个导航栏,它在所有路由上共享。 我希望当前用户的用户名在登录时显示在导航栏上。我已经让这个工作,但目前在用户登录后,我必须手动刷新页面之前,用户名出现 在我的应用程序中,登录系统是基于令牌的。当用户登录时,用户名和令牌保存在本地存储中。我可以检查登录后是否发生这种情况,但由于登录时不需要刷新标题,因此它不会显示用户名。如果我在登录后重新加载页面,标题将正确显示用户名 当用户登录时,如何强制header组件从auth服务获取用户名 从标题组件-- 导出类HeaderCompone

我在标题组件中有一个导航栏,它在所有路由上共享。 我希望当前用户的用户名在登录时显示在导航栏上。我已经让这个工作,但目前在用户登录后,我必须手动刷新页面之前,用户名出现

在我的应用程序中,登录系统是基于令牌的。当用户登录时,用户名和令牌保存在本地存储中。我可以检查登录后是否发生这种情况,但由于登录时不需要刷新标题,因此它不会显示用户名。如果我在登录后重新加载页面,标题将正确显示用户名

当用户登录时,如何强制header组件从auth服务获取用户名

从标题组件--

导出类HeaderComponent实现OnInit{
私有用户:用户;
建造师(
公共授权:授权服务,
私人警报服务:警报服务
) { 
this.currentUser=auth.getCurrentUserName();
}
恩戈尼尼特(){
}
}
身份验证服务

@Injectable()
导出类身份验证服务{
公共令牌:字符串;
构造函数(专用http:HttpClient){
公共getCurrentUserId(){
if(localStorage.getItem('currentUser')){
返回JSON.parse(localStorage.getItem('currentUser')).id;
}否则返回“”;
}

我建议您使用可观察的:

@Injectable()
export class AuthService {
private _currentUser: BehaviorSubject<string>;

constructor() {
    this._currentUser = new BehaviorSubject("");
}

getCurrentUser(): Observable<string> {
    return this._currentUser.asObservable();
}

setUser(user: string) {
    this._currentUser.next(user);
}

我所需要做的就是在模板中直接使用auth服务中的函数,而不是首先设置局部变量

  • {{auth.getCurrentUserName()}} ...
  • 通常的方式是订阅某种形式的通知/观察。有人能解释为什么这比我现在做的更好吗?
    export class HeaderComponent implements OnInit {
    private currentUser: User;
    
    constructor(
        public auth: AuthService,
        private alertService: AlertService
    ) {
        this.currentUser = auth.getCurrentUser()
            .subscribe(user => this.currentUser = user);
    }
    ngOnInit() {
    
    }
    }