У меня есть одностраничное приложение на основе Aurelia, и я пытаюсь заставить его работать с существующим бэкэндом SignalR. Я загрузил javascript-клиент SignalR и вручную интегрировал его с приложением Aurelia (т. е. я не использую прокси-файл). Я могу подключиться к концентратору SignalR и увидеть сообщения о прибытии в консоли ... пока все хорошо. Теперь я пытаюсь использовать агрегатор событий Aurelia, чтобы при поступлении нового сообщения концентратора событие запускалось, и любые компоненты приложения, подписанные на это конкретное событие, выполняли некоторую работу. Проблема заключается в том, что обратный вызов события SignalR, по-видимому, не может получить доступ к объекту агрегатора событий. Вот код, иллюстрирующий проблему:
//Import statements omitted for brevity
@inject (EventAggregator)
export class MyService{
constructor(eventAggregator) {
this.ea = eventAggregator;
this.connection = $.hubConnection("http://localhost:8080/signalr", { useDefaultPath: false });
this.hub = this.connection.createHubProxy("myHub");
//Register a callback function to fire when a new hub message arrives
this.hub.on("sendMessage", this.processHubMessage);
//No issues so far - all this constructor code works fine
}
processHubMessage(message) {
// This doesn't work - this.ea is undefined in the scope of this function
this.ea.publish('deviceStatusUpdate', message);
}
}
Объект агрегатора событий, на который ссылается функция обратного вызова, не определен — я полагаю, потому что он не вызывается в рамках класса. Есть ли способ решить эту проблему? Как предоставить функции обратного вызова доступ к свойствам класса (this.ea в моем примере).