在角度应用程序中实现切换到另一个套接字通道

时间:2019-04-18 10:13:15

标签: angular rxjs

在我的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
    )
}

但是问题是它不起作用,它是取消订阅的部分,但是由于某种原因从不订阅另一个频道。我不明白为什么。我应该如何处理这个问题?

我对这些东西是完全陌生的,我感到完全迷失了,因此任何帮助将不胜感激。

1 个答案:

答案 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) { }