реализовать переключение на другой канал сокета в угловом приложении - PullRequest
0 голосов
/ 18 апреля 2019

В моем компоненте DashBoard объект Dash, содержащий всю необходимую мне информацию, должен поступать с сервера через канал сокета.

Эти каналы относятся к некоторым параметрам, которые пользователь может выбрать на панели инструментов.То есть, если он выбирает один вариант, я должен подключить его к одному каналу, если он выбирает другой вариант, я подключаю его к другому каналу.

Чтобы подключиться к определенному каналу, я должен сначала сделать HTTP-запрос POSTс некоторыми параметрами, необходимыми для предоставления запроса с ожидаемыми данными.

В ответ сервер отправляет мне правильное имя канала (на самом деле это хеш, который должен быть добавлен в конце 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 голосов
/ 18 апреля 2019

Вы можете попробовать обновить переменные вашего компонента в угловой зоне:

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) { }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...