Aurelia активируют с помощью signalR - PullRequest
0 голосов
/ 01 апреля 2019

Как я могу использовать signalR с циклом страниц aurelia canActivate () и activ ()? Я имею в виду ... В моем конструкторе VM я инициализирую соединение signalR. в методах canActivate () или activ () я запускаю соединение signalR. На стороне сервера, в Hub, когда клиент подключается, я получаю данные для клиента и публикую их на подключенном клиенте. Таким образом, клиент Aurelia будет получать данные асинхронно. Таким образом, страница будет отображаться пустой, и когда данные поступят, они обновят их. Но я хочу дождаться данных из концентратора signalR, прежде чем отобразить страницу.

Итак, рабочий стол такой:

  1. VM constructor => Построить соединение signalR с (HubConnectionBuilder)
  2. VM Constructor => Установить события подключения, такие как "onConnected"
  3. VM activ () => Запустите соединение, вызвав this.connection.start ();
  4. SignalR Hub.OnConnectedAsync () => получить данные из БД
  5. SignalR Hub.OnConnectedAsync () => Отправка данных только для нового подключенного клиента (Clients.Client (Context.ConnectionId) .SendAsync ("onConnected", data);)
  6. VM onConnected обработчик события => получает данные и устанавливает модель (this.model = data)

Когда рабочий процесс достигает шага № 4, страница уже отображается пустой.

VM

@autoinject
export class AlarmsVM {
  model: any;    
  connection: HubConnection;

  constructor() {
     this.connection = new HubConnectionBuilder()
        .withUrl("/alarmsHub")
        .configureLogging(LogLevel.Information)
        .build();

    this.connection.on("onConnected", (data) => this.model = data);
    this.connection.on("onUpdate", (data) => this.model = data);
  }

  async activate() {
    await this.connection.start().catch(err => console.error(err.toString()));
  }

  async deactivate() {
    await this.connection.stop();
  }
}

signalR Hub

public class AlarmsHub:Hub
{
    private readonly IMediator _mediator;

    public AlarmsHub(IMediator mediator)
    {
        _mediator = mediator;
    }

    public override async Task OnConnectedAsync()
    {
        var data = await _mediator.Send(new GetAlarmsQuery());
        await Clients.Client(Context.ConnectionId).SendAsync("onConnected", data);
    }

    ...
}

1 Ответ

1 голос
/ 03 апреля 2019

Согласно документации, вы можете вернуть обещание из activ (), и навигация произойдет только после разрешения обещания: https://aurelia.io/docs/api/router/interface/RoutableComponentActivate/method/activate/

РЕДАКТИРОВАТЬ

Я неправильно прочитал ваш первоначальный вопрос,вы в основном хотите, чтобы активация разрешалась при получении события onConnected.Оберните разрешение onConnected в обещание в activ (), и вам будет хорошо, пример кода:

  activate() {
    this.connection.start().catch(err => console.error(err.toString()));
    return new Promise((resolve, reject) => {
       this.connection.on("onConnected", (data) => {
          this.model = data;
          return resolve();
       });
    });
  }
...