8

使用 Signalr (1.0.0-alpha2),我想知道是否可以在连接启动后添加客户端功能。

假设我创建了连接并获取了代理。然后我将一些 Server Fired 客户端功能添加到集线器来做一些事情。然后我开始我的连接。然后我想向我的集线器对象添加更多的 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 组件以处理它们特定的“消息类型”。我应该为这些创建单独的集线器,还是应该能够即时添加更多的 Server Fired 客户端功能?

4

2 回答 2

14

是的你可以。使用 .on 方法。

例子:

myHub.on('somethingNew', function() {
    alert("This was called after the connection started!");
});

如果您想稍后将其删除,请使用 .off 方法。

于 2012-11-21T17:42:23.000 回答
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;
        }
    }
}

注意:处理断开连接或连接丢失可能需要额外的工作。

于 2015-05-28T07:44:13.383 回答