angular - 标题组件在刷新时丢失状态
问题描述
当用户登录时,他们的名字会显示在导航栏中。但是,当用户刷新页面时,他们的名字就会消失。
我尝试将 isLoginNameSubject 从主题更改为 ReplaySubject 和 BehaviorSubject。
Authservice:当用户提交表单时调用 login(),这会产生两个副作用,将令牌存储在 LocalStorage 中,使用响应的子集填充导航栏(标题)。
export class AuthenticationService {
private uri: string;
public isLoginNameSubject = new BehaviorSubject<Object>('test');
constructor(
private http: HttpClient,
private config: Configuration,
private router: Router ) {
this.uri = this.config.getConfigOption('apiUri');
}
public login = (email: string, password: string) => {
return this.http.post(
`${this.uri}/authenticate?login=${email}&password=${password}`,
undefined
).pipe(
tap(res => localStorage.setItem('token', JSON.stringify(res))),
tap(res => this.isLoginNameSubject.next(res.user.data)))
}
public loginName(): Observable<object> {
return this.isLoginNameSubject.asObservable().pipe(share())
}
Header TS:我注入 loginName() 来隐藏 Subject 的实现。
export class HeaderComponent implements OnInit {
public userName$: Observable<object>
constructor(
private authService: AuthenticationService,
private config: Configuration) {
}
ngOnInit() {
this.userName$ = this.authService.loginName()
}
}
标题模板:
<strong *ngIf="userName$ | async as user">
{{user.name}}
</strong>
当用户登录时,用户会被带到一个欢迎页面。导航栏/标题内容由 res.user.data 中的内容填充,特别是用户名。当用户刷新页面时,我希望用户名继续显示。事实上,事实并非如此。似乎 res.user.data 在刷新时丢失了。
最初我推断这是因为 isLoginNameSubject 只是一个主题。刷新页面时重新加载,但没有登录事件。我尝试使用 isLoginNameSubject 作为 BehaviorSubject,因为我知道它会发出最后一个值,但问题仍然存在。
解决方案
推荐阅读
- javascript - 在JS中切换时截断字符串
- c++ - 抛出异常:读取访问冲突**this**
- javascript - 在 React Native 中从 API 设置数据
- r - 使用填充时 geom_point 中的点大小
- c++ - 我在本地机器上得到了正确的解决方案,但 Topcoder 不接受这个,谁能帮助我
- python - 如何在 Plotly/Dash 中管理 CSS 伪类?
- java - 如何使用 DAO 在 Spring Boot 查询中返回特定对象属性?
- firebase - 带有英国邮政编码距离搜索的 Flutter Firebase 实时数据库
- arrays - 从存档中打开图像并加载到 cv2
- sql-server - .net Core 一对多关系太慢