Signalr 信号器(1.0.0-alpha2)集线器-连接启动后,您可以添加客户端功能吗?
使用signar(1.0.0-alpha2),我想知道在连接启动后是否可以添加客户端函数 假设我创建连接并获取代理。然后,我将一些服务器启动的客户机函数添加到中心,以完成一些事情。然后我开始连接。然后,我想向我的集线器对象添加更多的服务器触发函数。这可能吗Signalr 信号器(1.0.0-alpha2)集线器-连接启动后,您可以添加客户端功能吗?,signalr,signalr-hub,Signalr,Signalr Hub,使用signar(1.0.0-alpha2),我想知道在连接启动后是否可以添加客户端函数 假设我创建连接并获取代理。然后,我将一些服务器启动的客户机函数添加到中心,以完成一些事情。然后我开始连接。然后,我想向我的集线器对象添加更多的服务器触发函数。这可能吗 var myHub= $.connection.myHub; myHub.SomeClientFunction = function() { alert("serverside called 'Clients.SomeClientFun
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()'");
}
})
这个例子并不现实,但我基本上希望在hub开始订阅原始代码不关心的新事件之后,将我的“myHub”变量发送到另一个对象
现实生活中的示例:包含许多不同中心事件(新站点访问、聊天消息、站点错误)的仪表板。我在连接启动后“订阅”,然后将我的集线器代理传递给所有不同的UI组件,以处理它们特定的“消息类型”。我应该为它们创建单独的集线器,还是应该能够动态添加更多服务器启动的客户端功能 是的,你可以。使用.on方法 例如:
myHub.on('somethingNew', function() {
alert("This was called after the connection started!");
});
如果以后要删除它,请使用.off方法。我有完全相同的情况。如果试图从多个地方调用它,您可能需要考虑添加另一个抽象布局。 这是我的初步版本(打字稿) 我将从用法开始
SignalManager
是我的“manager”类,它抽象了我的debuggingHub
hub。我有一个在服务器上触发的客户端方法fooChanged
在使用信号器的模块中,我只调用start
方法,如果已经启动,则不会重新启动
// ensure signalR is started
SignalRManager.start().done(() =>
{
$.connection.debuggingHub.server.init();
});
您的“模块”只是通过manager类注册其回调,并且每当触发SignalR客户端方法时,都会调用您的处理程序
// handler for foo changed
SignalRManager.onFooChanged((guid: string) =>
{
if (this.currentSession().guid == guid)
{
alert('changed');
}
});
这是一个简单版本的signalrmager
,它使用jQuery$。回调将请求传递给尽可能多的模块。当然,你可以使用任何你想要的机制,但这似乎是最简单的
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;
}
}
}
模块RR
{
导出类信号管理器
{
//调用hub.Start时返回了原始承诺
静态启动:JQueryPromise;
私有静态_fooChangedCallback=$.Callbacks();
//为“fooChanged”回调添加回调
静态onfooChanged(回调:(guid:string)=>any)
{
SignalManager.\u fooChangedCallback.add(回调);
}
静态启动():JQueryPromise
{
如果(!SignalManager.\u启动)
{
//fooChanged的回调
$.connection.debuggingHub.client.fooChanged=(guid:string)=>
{
console.log('foo-Changed'+guid);
SignalManager.\u fooChangedCallback.fire.apply(参数);
};
//启动hub并保存返回的承诺
SignalManager.\u start=$.connection.hub.start().done(()=>
{
console.log('Signal R initialized');
});
}
返回信号管理器。\u启动;
}
}
}
注意:可能需要额外的工作来处理断开或断开的连接 在调用start之前,您至少需要有一个订阅。@dfowler是每个集线器有一个订阅,还是总共有一个订阅?订阅是否意味着已经有了服务器可以调用的功能?每个集线器。订阅意味着您在客户端定义了回调。