连接到不同页面上的不同集线器

时间:2013-07-18 13:56:46

标签: signalr

我正在构建一个使用sammy.js,knockout.js和SignalR的单页应用。主页面(index.html)根据客户端路由将其他html页面加载到div中。

我有2个SignalR集线器,一个连接到服务器端推送数据的初始页面,这很好用。但是,当用户导航到其中时,其中一个页面也应该连接到另一个集线器。

在主页面中,我正在执行以下操作:

window.hubReady = $.connection.hub.start()

var hub1 = $.connection.hub1;
hub1.updateReceived = function () { 
    alert('data from server');
}

window.hubReady.done(function() {
    hub1.server.start(); 
});

在第二页我有:

var hub2 = $.connection.hub2;
hub2.updateReceived = function () { 
    alert('data from server');
}

window.hubReady.done(function() {
    hub2.server.start(); 
});

但是我从未在第二页收到任何更新。

知道我哪里错了吗?

2 个答案:

答案 0 :(得分:1)

要从集线器接收更新,您必须在启动连接时为该集线器至少声明一个客户端功能。从您使用的库来判断我假设您有一个单页应用程序,因此在连接已经开始之前不会实例化您的hub2数据。

因此,一个简单的解决方法是在调用start之前,在hub1客户端函数旁边声明一个hub2客户端函数。如果要在连接开始后添加更多客户端功能,则必须使用.on方法。

AKA:

hub2.on("updateReceived", function () {
    alert("data from server");
});

答案 1 :(得分:0)

我创建了一个名为SignalR.EventAggregatorProxy的库。 它代理服务器端域事件和客户端代码之间的代理。它的设计考虑了MVVM和SPA,并负责所有的集线器管道。检查wiki以了解如何设置它。

https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki

一旦配置好,您需要订阅一个事件

ViewModel = function() {
   signalR.eventAggregator.subscribe(MyApp.Events.TestEvent, this.onTestEvent, this);
};

MyApp.Events.TestEvent对应于服务器端.NET事件。您还可以约束哪个事件应该使用哪个