在我的DashBoard组件中,包含我需要的所有信息的Dash对象应该通过套接字通道来自服务器。
这些通道与用户可以在仪表板上选择的某些选项相关。就是说,如果他选择一个选项,我应该将他连接到一个频道,如果他选择另一个选项,则我将他连接到另一个频道。
为了连接到某个频道,我应该首先发出POST http请求,并使用一些参数为请求提供期望的数据。
作为响应,服务器向我发送了正确的频道名称(实际上,这是一个哈希,应在用于建立套接字连接的url末尾附加)。我将此哈希放在本地存储中。
要订阅频道,我编写了一项服务,其使用方式如下:
this.socketInfoService.getDashInfoBySocket(channelName).subscribe(
(res: Dash) => this.dash = res
)
为了弄清楚事情是如何工作的,我首先决定在Dash组件上编写某种方法,该方法希望将套接字通道作为其自变量并打开/预订该通道。
就是这样的(我知道这很糟糕,但是由于缺乏知识和时间,我现在无法提出更好的东西)
public changeChannel(newChannelName: string)
{
if (this.sub)
{
this.sub.unsubscribe();
}
this.sub = this.socketInfoService.getDashInfoBySocket(newChannelName).subscribe(
(res: Dash) => this.dash = res
)
}
但是问题是它不起作用,它是取消订阅的部分,但是由于某种原因从不订阅另一个频道。我不明白为什么。我应该如何处理这个问题?
我对这些东西是完全陌生的,我感到完全迷失了,因此任何帮助将不胜感激。
答案 0 :(得分:0)
您可以尝试在Angular区域内更新组件变量:
public changeChannel(newChannelName: string)
{
if (this.sub)
{
this.sub.unsubscribe();
}
this.sub = this.socketInfoService.getDashInfoBySocket(channelName).subscribe(
(res: Dash) => {
this.zone.run(() => {
this.dash = res;
});
}
)
}
其中zone
是@angular/core
的服务
import { Component, OnInit, NgZone } from '@angular/core';
constructor(private zone: NgZone) { }