我正在构建一个使用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();
});
但是我从未在第二页收到任何更新。
知道我哪里错了吗?
答案 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事件。您还可以约束哪个事件应该使用哪个