Как я могу использовать signalR с циклом страниц aurelia canActivate () и activ ()?
Я имею в виду ... В моем конструкторе VM я инициализирую соединение signalR. в методах canActivate () или activ () я запускаю соединение signalR. На стороне сервера, в Hub, когда клиент подключается, я получаю данные для клиента и публикую их на подключенном клиенте. Таким образом, клиент Aurelia будет получать данные асинхронно. Таким образом, страница будет отображаться пустой, и когда данные поступят, они обновят их. Но я хочу дождаться данных из концентратора signalR, прежде чем отобразить страницу.
Итак, рабочий стол такой:
- VM constructor => Построить соединение signalR с (HubConnectionBuilder)
- VM Constructor => Установить события подключения, такие как "onConnected"
- VM activ () => Запустите соединение, вызвав this.connection.start ();
- SignalR Hub.OnConnectedAsync () => получить данные из БД
- SignalR Hub.OnConnectedAsync () => Отправка данных только для нового подключенного клиента (Clients.Client (Context.ConnectionId) .SendAsync ("onConnected", data);)
- 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);
}
...
}