Typescript 角度5更新视图

Typescript 角度5更新视图,typescript,angular5,Typescript,Angular5,My app.component收到日期,但在用户注销和另一次登录后-此数据仍然相同。仅在刷新页面视图后显示正确的日期 在数据库中更改视图时,如何更新视图上的日期 应用程序组件 ngOnInit() { this.getCurrentUser() } getCurrentUser() { this.apiService.getCurrentUser().subscribe( data => { this.user = data }, err

My app.component收到日期,但在用户注销和另一次登录后-此数据仍然相同。仅在刷新页面视图后显示正确的日期

在数据库中更改视图时,如何更新视图上的日期

应用程序组件

ngOnInit() {
    this.getCurrentUser()
  }

getCurrentUser() {
      this.apiService.getCurrentUser().subscribe(
      data => { this.user = data },
      err => console.error(err)
    );   
}
app.component.html

<p>{{user.name}}</p>
{{user.name}

api.service

getCurrentUser() {
  return this.http.get<any>(this.path + '/curruser')
}
loginUser(loginData) {
    this.http.post<loginUserData>(this.path + '/login', loginData).subscribe(res => {     
      this.saveToken(res.token)
      this.router.navigate(['/'])

    }, error => {
      console.log('error', error)
    })
  }
getCurrentUser(){
返回this.http.get(this.path+'/curruser')
}
认证服务

getCurrentUser() {
  return this.http.get<any>(this.path + '/curruser')
}
loginUser(loginData) {
    this.http.post<loginUserData>(this.path + '/login', loginData).subscribe(res => {     
      this.saveToken(res.token)
      this.router.navigate(['/'])

    }, error => {
      console.log('error', error)
    })
  }
loginUser(loginData){
this.http.post(this.path+/login',loginda).subscribe(res=>{
this.saveToken(res.token)
this.router.navigate(['/'])
},错误=>{
console.log('error',error)
})
}

问题在于您没有为Ngonint中的数据实际更新设置初始订阅。订阅接收数据可确保应用程序接收数据,但应用程序组件不知道数据已异步更新。因此,您需要一个单独的订阅来更新数据/视图

这样做:

userSubcription: Subscription;

ngOnInit() {
    this.userSubscription = this.userService.dataReceived.subscribe(
    (user) => {
      this.user = user;
    });
    this.getCurrentUser();
}

ngOnDestroy() {
    this.userSubscription.unsubscribe();
}

getCurrentUser() {
      this.apiService.getCurrentUser().subscribe(
      data => this.userService.dataReceived.next(data),
      err => console.error(err)
    );   
}

您需要一个额外的userService来创建一个您可以订阅的主题。

您的代码没有问题,但是从后端服务请求当前用户只发生一次,如果不重新请求它,它将不会更新

如果ApiService正在存储当前用户,则该用户应该是可观察的用户,您可以对其进行更新:

user: new BehaviorSubject<User>();
最好使用异步管道并让Angular为您处理订阅:

<p *ngIf="apiService.user | async as user">{{ user.name }}</p>

再次调用getCurrentUser()?我尝试在登录组件中执行此操作,但视图没有更新。那么您的代码一定有问题。如果你不发,我们也帮不上忙。你说的日期是指数据?您对数据库所做的哪些更改会影响视图?将代码发布到您的
apiService.getCurrentUser()
。我想你会发现问题就在那里
.getCurrentUser()
可能会在每次调用时创建一个新的可观察对象,因此您只订阅在调用
.getCurrentUser()
时创建的1个可观察对象,而不是后续调用。谢谢,但实际上我有点搞不清楚需要将此代码放在哪里。我有两个主要服务-aut.service,其中有login/logout和api.service,其中包括:getCurrentUser(){返回this.http.get(this.path+'/curruser')}我需要在我的组件中运行哪个函数?如果在aut.service中已经有login/lout,那么应该在那里添加用户行为子对象。为什么当前用户有一个端点,它是如何工作的?通常后端不会告诉客户端当前用户。当前用户由JWT令牌或会话状态引用。