2013-07-18 31 views
0

我正在构建一个使用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(); 
}); 

不过,我从来没有收到在第二页中的任何更新。

任何想法我错了?

回答

1

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

所以一个简单的解决方法是在调用start之前声明hub1客户端函数以及hub1客户端函数。如果你想在连接启动后添加更多的客户端功能,你必须使用.on方法。

又名:

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

真的吗?这很烦人,我希望将客户端代码分离到视图模型中,以便查看它所关注的视图。此外,这是否意味着服务器将数据发送到客户端,如果Hub2视图未加载,我将丢弃该数据? –

+0

就你而言是的。如果您真的想要阻止额外的数据,另一个选择是您可以重新启动SignalR连接。也就是说,当您导航到需要hub2的内部页面之一时,您可以调用stop,然后添加新的hub2方法,然后调用连接启动。此时,您也可以从hub1删除绑定。 –

+0

只要应用程序正在运行,hub1就会保持活动状态,hub2仅在打开时才由一个视图使用。好的,如果我停止/添加/开始,当应用程序离开该视图时,是否需要删除hub2?集线器连接是否会保持在范围内,并且仍然会收到数据,即使没有视图可以显示它们? –

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的事件。你也可以约束哪些事件应该去哪些用途

+0

我会检查这一点,欢呼提及它。 –

相关问题