接收到 websocket 消息后,如何从组件 **ts** 文件中重新呈现角度组件视图?

Posted

技术标签:

【中文标题】接收到 websocket 消息后,如何从组件 **ts** 文件中重新呈现角度组件视图?【英文标题】:how to Rerender angular component view from the component's **ts** file after recieving a websocket message? 【发布时间】:2020-06-15 07:28:51 【问题描述】:

我有一个在 ngOnInit() 上初始化的用户列表,当我删除或添加或修改用户时,html 组件使用 reloadData() 函数重新呈现就好了.. 但是当我收到来自我的 webskoket 服务的消息时我调用 reloadData() 函数,它会从数据库中刷新模型,但不会刷新视图。

这是我的 EmployeesComponent.ts 上的 reloadData() 函数:

private reloadData() 
this.users = [];
console.log('reloading employees..');
console.log(this.users);
this.userService.list().subscribe(r => 
  if (this.router.url === '/RemoteMonitoring/(mainCon:Departments)' && this.clickedDep.depId !== -1) 
    this.chefDep = null;
    this.setChefDep(this.clickedDep.depId);
    this.usersForDep = r;
    for (const emp of this.usersForDep) 
      if (emp.department.depId === this.clickedDep.depId) 
        this.users.push(emp);
      
    
    this.clickedDep.users = [];
    this.clickedDep.users = this.users;
    this.outPutData.emit();
   else 
    this.userService.findUserWithToken().subscribe(us => 
      for (const emp of r) 
        // @ts-ignore
        if (emp.userId !== us.userId) 
          this.users.push(emp);
        
      
    );
  
);

这是我显示用户的地方[]

 <tr *ngFor="let emp of users; let i = index; trackBy:identify">...</tr>

这是 *ngFor 中调用的识别函数:

identify(index, item) 
return index;

这是由 websocket 触发的函数,在其中我调用 reloadData():

reloadFromSocket() 
console.log('Reloading users from websocket...');
this.reloadData();

而且我知道代码运行良好,因为我正在控制台中记录所有内容。您可以在此处看到 “正在从 websocket 重新加载用户...” 消息正在记录中.. Console Screen Shot

正在重新加载模型,但未重新渲染视图。

谢谢????????

【问题讨论】:

【参考方案1】:

我发现了问题..我将组件注入到服务中,因此它创建了一个新实例..所以它重新加载了新实例的数据,而不是屏幕上呈现的数据,这是解决方案解决这个问题:

How to call a component method from service class - Angular

【讨论】:

以上是关于接收到 websocket 消息后,如何从组件 **ts** 文件中重新呈现角度组件视图?的主要内容,如果未能解决你的问题,请参考以下文章

按接收顺序处理 WebSockets 消息

按接收顺序处理 WebSockets 消息

如何将消息传递给websocket?

通过 websocket 接收图片

Spring Websockets:如何验证消息和接收客户端?

连接打开后如何从javax websocket服务器获取消息