【问题标题】:How to deal with async request and display the data properly如何处理异步请求并正确显示数据
【发布时间】:2018-07-15 09:41:22
【问题描述】:

我的 html 页面上有一个标记组件,用于指示有多少未读消息。 html代码:

<button class="font" mat-menu-item routerLink="/message">
  <mat-icon>notifications</mat-icon>
  <span [matBadgeHidden]="newMessageNum === 0" matBadge={{newMessageNum}} matBadgeOverlap="false" matBadgeColor="warn">Messages</span>
</button>

变量newMessageNum是通过http请求后端获取的。代码:

ngOnInit() {
  this.userService.getCurrentUser().subscribe(
    res => {
      if (res) {
        this.currentUser = res;
        this.messageService.getNewMessagesNum(this.currentUser.username).subscribe(
          res => {
            if (res.success) this.newMessageNum = res.number;
          },
          err => console.log(err)
        )
      }
    }
  )
}
但是问题是当我登录我的网站时,newMessageNum 为 0,并且即使我有几条新消息,徽章也会隐藏,刷新页面后,徽章就会出现。我认为这与异步请求有关。我是新来的。谢谢你的帮助!

【问题讨论】:

  • 登录时打开网站时设置的值,如果打开网站后未登录则认为0?

标签: javascript node.js angular typescript asynchronous


【解决方案1】:

问题是由于在从服务器获得响应后 Angular 未正确更新您的组件。所以你必须调用更改检测,使用ngZoneChangeDetectorRef

示例:

constructor(private cdr:ChangeDetectorRef){
  ...
  ...
}
ngOnInit() {
  this.userService.getCurrentUser().subscribe(
    res => {
     if (res) {
       this.currentUser = res;
       this.messageService.getNewMessagesNum(this.currentUser.username).subscribe(
       res => {
         if (res.success) {
            this.newMessageNum = res.number;
            this.cdr.detectChanges();
         }
       },
       err => console.log(err)
       )
     }
   });
}

【讨论】:

  • 我想我的程序逻辑可能有问题。上面的代码本来是在 header 组件中,所以是在登录之前加载的。所以会出现错误,因为登录前没有用户。所以我想我应该把这段代码放到其他组件中,登录后我需要通知 header 组件 newMessageNum 值并显示徽章。你知道如何将值从一个组件传递到标题组件吗?谢谢!
  • 已解决,通过观看这个精彩的视频:youtube.com/watch?v=I317BhehZKM