2016-03-28 67 views
1

我有一個基於Aurelia的單頁應用程序,我試圖讓它與現有的SignalR後端一起工作。我已經下載了SignalR javascript客戶端並手動將其與Aurelia應用程序集成(即,我沒有使用代理文件)。我能夠連接到SignalR集線器並查看控制檯中的活動消息....迄今爲止非常好。現在,我正嘗試使用Aurelia Event Aggregator,以便在新的中心消息到達時觸發事件,並且該應用程序的任何組件都訂閱了該特定事件將會執行一些工作。問題在於SignalR事件回調似乎無法訪問Event Aggregator對象。下面的代碼來說明問題:在回調函數中引用無法獲取與Aurelia Event Aggregator一起發佈的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)。

回答

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