使用Signalr(1.0.0-alpha2),我想知道在连接启动后是否可以添加客户端功能。
假设我创建了我的连接并获取代理。然后我将一些Server Fired客户端功能添加到集线器中以执行一些操作。然后我开始我的连接。然后我想在我的hub对象中添加一些Server Fired函数。这可能吗?
var myHub= $.connection.myHub;
myHub.SomeClientFunction = function() {
alert("serverside called 'Clients.SomeClientFunction()'");
};
$.connection.hub.start()
.done(function() {
myHub.SomeNewClientFunction = function() {
alert("serverside called 'Clients.SomeNewClientFunction()'");
}
})
这个例子不太现实,但我基本上想在集线器开始订阅原始代码不关心的新事件后,将我的'myHub'变量发送到另一个对象。
真实生活示例:包含许多不同中心事件的仪表板(新站点访问,聊天消息,站点错误)。我在连接开始后“订阅”,然后将我的集线器代理传递给我所有不同的UI组件,以处理他们特定的“消息类型”。我应该为这些创建单独的集线器还是应该能够动态添加更多服务器触发的客户端功能?
答案 0 :(得分:14)
是的,你可以。使用.on方法。
示例:
myHub.on('somethingNew', function() {
alert("This was called after the connection started!");
});
如果您想稍后使用.off方法删除它。
答案 1 :(得分:0)
我有完全相同的情况。如果您尝试从多个位置调用它,可能需要考虑添加另一种抽象布局。
这是我提出的初步版本(打字稿)。
我将从使用开始。 SignalRManager
是我的“经理”课程,它抽象了我的debuggingHub
中心。我有一个在服务器上触发的客户端方法fooChanged
。
在使用SignalR的模块中的某处我只调用start
方法,如果已经启动,则不会重新启动。
// ensure signalR is started
SignalRManager.start().done(() =>
{
$.connection.debuggingHub.server.init();
});
您的'模块'只是通过管理器类注册其回调,并且每当触发SignalR客户端方法时,都会调用您的处理程序。
// handler for foo changed
SignalRManager.onFooChanged((guid: string) =>
{
if (this.currentSession().guid == guid)
{
alert('changed');
}
});
这是SignalRManager
的简单版本,它使用jQuery $.Callbacks
将请求传递给尽可能多的模块。当然你可以使用你想要的任何机制,但这似乎是最简单的。
module RR
{
export class SignalRManager
{
// the original promise returned when calling hub.Start
static _start: JQueryPromise<any>;
private static _fooChangedCallback = $.Callbacks();
// add callback for 'fooChanged' callback
static onfooChanged(callback: (guid: string) => any)
{
SignalRManager._fooChangedCallback.add(callback);
}
static start(): JQueryPromise<any>
{
if (!SignalRManager._start)
{
// callback for fooChanged
$.connection.debuggingHub.client.fooChanged = (guid: string) =>
{
console.log('foo Changed ' + guid);
SignalRManager._fooChangedCallback.fire.apply(arguments);
};
// start hub and save the promise returned
SignalRManager._start = $.connection.hub.start().done(() =>
{
console.log('Signal R initialized');
});
}
return SignalRManager._start;
}
}
}
注意:处理断开连接或丢失连接可能需要额外的工作。