2016-03-28 7 views
1

У меня есть одностраничное приложение на основе Aurelia, и я пытаюсь заставить его работать с существующим бэкэндом SignalR. Я загрузил javascript-клиент SignalR и интегрировал его с приложением Aurelia вручную (т. Е. Я не использую прокси-файл). Я могу подключиться к концентратору SignalR и видеть приходящие сообщения в консоли ... пока все хорошо. Теперь я пытаюсь использовать агрегатор событий Aurelia, так что, когда приходит новое сообщение хаба, событие запускается, и любые компоненты приложения, подписанные на это конкретное событие, будут выполнять определенную работу. Проблема в том, что обратный вызов события SignalR, похоже, не может получить доступ к объекту агрегатора событий. Вот код, чтобы проиллюстрировать этот вопрос:Не удается получить события клиента SignalR, опубликованные с помощью агрегатора событий Aurelia

//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 в моем примере).

ответ

3

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

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

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

+0

Спасибо за помощь ... Это работало отлично! – CharlieB

0

Я думаю, что вам не хватает «начала» для вашего прокси, также вам может потребоваться псевдоним вашей модели просмотра, чтобы перейти к 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(); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^