2016-03-28 15 views
1

ile yayınlanan SignalR istemci olaylarını alamıyorum Aurelia'ya dayanan tek bir sayfa uygulamasına sahibim ve varolan bir SignalR arka ucunda çalışmaya çalışıyorum. SignalR javascript istemcisini indirdim ve elle Aurelia uygulaması ile entegre ettim (yani bir proxy dosyası kullanmıyorum). SinyalR göbeğine bağlanabiliyorum ve konsoldaki arrvive mesajlarını görebiliyorum .... Şimdiye kadar çok iyi. Şimdi, Aurelia Etkinlik Toplayıcısı'nı kullanmaya çalışıyorum, böylece yeni bir hub mesajı geldiğinde bir etkinlik başlatılır ve bu özel etkinliğe abone olan uygulamanın herhangi bir bileşeni bazı işler yapar. Sorun, SignalR olay geri çağrısının Event Aggregator nesnesine erişemeyeceği yönündedir. İşte sorunu göstermek için kod: geri arama işlevi içinde başvurulanAurelia Olay Toplayıcısı

//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); 
    } 
} 

olay toplayıcı nesne tanımlı değil - bu sınıfın kapsamında çağrılan değil çünkü varsayalım. Bunu çözmenin bir yolu var mı? Geri çağırma işlevi sınıf özelliklerine nasıl erişirim (örneğimde this.ea).

cevap

3

deneyin nedeniyle this Ne olmasını bekliyoruz ne değildir nasıl

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

yalnızca senin başarısız oluyor kullanarak. Yağ oku işlevi kullanarak, this olmasını beklediğiniz şeydir. Bu, JavaScript'in gerçekten sinir bozucu bir parçasıdır, ancak şişman oklar bunun için basit bir çözüm sunar.

+0

Teşekkür ... Bu mükemmel çalıştı! – CharlieB

0

Proxy'niz için 'start' ı kaçırdığınızı düşünüyorum, ayrıca görünüm modelinizi HubProxy'ye geçirmek için takma adlara ihtiyacınız olabilir.

Bu benim için çalışıyor: Yardım için

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(); 
}