Signalr 信号器(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

使用signar(1.0.0-alpha2),我想知道在连接启动后是否可以添加客户端函数

假设我创建连接并获取代理。然后,我将一些服务器启动的客户机函数添加到中心,以完成一些事情。然后我开始连接。然后,我想向我的集线器对象添加更多的服务器触发函数。这可能吗

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是每个集线器有一个订阅,还是总共有一个订阅?订阅是否意味着已经有了服务器可以调用的功能?每个集线器。订阅意味着您在客户端定义了回调。