2013-04-17 19 views
15

我似乎有SignalR的JS客戶中心的問題。在SignalR客戶端集線器上的事件不會被調用

的問題是,在「開」的處理程序似乎不工作 - 它不會產生錯誤,但沒有接收服務器發出的信號。下面 的代碼顯示了一個摘要,我打電話的正常工作的服務器(使用Invoke) - 然後我打電話回acceptHubData應拿起客戶端上,但不是在服務器上。

我的目標是導航到每個頁面將打開一個特定的輪轂和釋放,當用戶移動到另一頁連接的連接頁面時!

編輯:使用下面的代碼片段的作品,但我想知道爲什麼下面使用'on'事件的代碼不起作用!

var superHub = $.connection.mySuperHub; 

    superHub.client.acceptHubData = function (data) { 
     $('<li>hello there' + data + '</li>').prependTo($('#ul1')) 
    } 

    $.connection.hub.start().done(function() { 
     $('<li>done phase 1</li>').prependTo($('#ul1')) 
    }); 

任何幫助將不勝感激!

這是客戶端代碼(JS)

$(document).ready(function() { 

    var myHub; 

    try { 

     var connection = $.hubConnection(); 

     connection.start().done(function() { 

      myHub = connection.createHubProxy("mySuperHub"); 

      myHub.on('acceptHubData', function (data) { 
       alert(data); // THIS IS NOT CALLED! 
      }); 

      myHub.invoke('AcceptSignal', "hello from the client2"); 

     }); 

    } 
    catch (e) { 
     alert(e.message); 
    } 
}); 

這是服務器代碼:

[HubName("mySuperHub")] 
public class MyHub : Hub 
{ 

    private readonly HubEngine _hubEngine; 

    public MyHub() : this(HubEngine.Instance) { } 

    public MyHub(HubEngine hubEngine) 
    { 
     _hubEngine = hubEngine; 
    } 

    public void AcceptSignal(string msg) 
    { 
     Clients.Caller.acceptHubData("hi"); 
     Clients.All.acceptHubData("hi"); 
    } 

} 
+0

看到這個http://stackoverflow.com/a/42527962/1770868 –

回答

40

你仍然可以使用on方法添加事件JS客戶中心方法SignalR的最新版本要求,但如果你不添加任何事件偵聽器的hubProxy調用hubConnection.start()之前,你將不會被認購到樞紐。當hubConnection啓動時,SignalR訂閱了您擁有事件處理程序的集線器。如果您未訂閱集線器,則在start()後向該集線器添加任何事件將不起作用。

如果添加至少一個事件偵聽器到集線器的start()之前,即使什麼都不做,然後你可以添加你想要的任何其他事件處理程序使用開始後on輪轂()和您處理程序將被調用。

如果你打電話之前start(),但只有on將成功地添加事件偵聽器start()被調用後添加使用hubProxy.on('eventName', function (...autogeneratedHubProxy.client.eventName = function (...事件沒關係。

+1

太棒了 - 這確實的作品 - 也不會猜到!我已經通過添加一個不存在的事件來測試它,這也是有效的!謝謝 – Marcel

+0

男人,我正在撕掉我的頭髮(我剩下的一點點)試圖找出我做錯了什麼。在你打電話給開始之前,似乎是訂閱了,但顯然這就是你需要做的。僅供參考 - 我使用'on()'方法,如果在'start()'之後訂閱,它將不起作用。 – Zach

+0

感謝他的工作。 –

1

不知道你所使用的SignalR的版本,但我一直在使用比較成功

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
context.Clients.All.acceptHubData("hello");  

和我的客戶:我的服務器上的語法如下

myHub.client.acceptHubData = function (data) { 
    console.log(data); 
} 
+0

感謝您的答覆 - 這確實是工作 - 我想明白爲什麼'on'事件原則不起作用 - 請參閱我的編輯! – Marcel

+0

可能您可能正在查看較老版本的signalr的文檔。當然,這是此文檔中推薦的方法:https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client-Hubs – paul

+0

我一直在尋找這一個https://github.com/SignalR/ SignalR /維基/ SignalR-JS-客戶Hubs-%28No代理%29 – Marcel

相關問題