Не удается опубликовать события клиента SignalR с помощью агрегатора событий Aurelia

У меня есть одностраничное приложение на основе 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 в моем примере).


person CharlieB    schedule 28.03.2016    source источник


Ответы (2)


Попробуйте использовать

this.hub.on("sendMessage", (message) => this.processHubMessage(message));

Это не работает на вас из-за того, что this не то, что вы ожидаете. Используя функцию жирной стрелки, this будет таким, каким вы его ожидаете. Это действительно разочаровывающая часть JavaScript, но толстые стрелки обеспечивают простой обходной путь.

person Ashley Grant    schedule 28.03.2016

Я думаю, что вам не хватает «старта» для вашего прокси, также вам может понадобиться псевдоним вашей модели просмотра, чтобы перейти к HubProxy.

Это работает для меня:

constructor(eventAggregator){
    this.eventAggregator = eventAggregator;

    var signalrAddress = 'https://pathToYouServer';
    var hubName = 'yourHubsName';

    var connection = $.hubConnection(signalrAddress);
    var eventHubProxy = connection.createHubProxy(hubName);
    var vm = this;

    eventHubProxy.on('yourBroadcastMessage', function(data) {
        vm.eventAggregator.publish(data);
    });

    connection.start();
}
person Rick    schedule 06.04.2016