【问题标题】:SignalR with multiple event handlers per eventSignalR 每个事件有多个事件处理程序
【发布时间】:2016-04-06 08:29:47
【问题描述】:

在 C# 中,我会将许多处理程序挂接到这样的事件:

event += firstEventHandler;
event += secondEventHandler;

但是我们用 SignalR 编写 JavaScript:

$.connection.someHubName.client.someEventName = function (item) {
    console.log("someMessage", item);
};

我创建了一个看起来有点像这样的包装器:

var signalRClient = {
    start: function (callback) {
        $.connection.hub.url = ajaxHttp + "/signalr";
        $.connection.hub.logging = true;
        if ($.connection.hub && $.connection.hub.state === $.signalR.connectionState.disconnected) {
            $.connection.hub.start({ jsonp: true, withCredentials: true, transport: ['webSockets', 'longPolling'] }).done(callback);
        } else {
            callback();
        }
    },
    connection: $.connection
}

我可以这样调用:

signalRClient.connection.somehub.client.someEvent = function (item) {
    console.log("someMessage", item);
};

signalRClient.start(function () { 
    signalRClient.connection.somehub.server.subscribe(someId);
});

但是如果我在多个视图中(在同一个渲染页面上)运行 signalRClient,它只能将一个函数分配给一个事件。我希望能够为一个事件分配许多功能。

我已阅读: connect to signalr hubSignalR client with multiple connections ++

但我认为为此目的创建到同一个集线器的许多连接不是一个好主意。我也会尽量避免在布局中创建我的 SignalR 代码,并使所有视图都依赖于此。

是否有可用的简单解决方案,以便我可以将许多事件处理程序连接到$.connection.somehub.client.event

【问题讨论】:

  • 您将所有这些事件处理程序作为函数正确吗?那么很简单,someEvent = function (item) { eventOne(item); eventTwo(item); eventThree(item); }
  • “我也会尽量避免在布局中创建我的 SignalR 代码,并使所有视图都依赖于此。” - 这就是我不想做你解释的原因......这也是signalRClient可重用的原因......
  • "I would also try to avoid creating my SignalR code in a layout and make all views dependent on this" 我不明白这个。能不能说的清楚一点。要使所有视图都依赖于此,那么这必须是布局的一部分。如果您不想在布局代码中编写代码,请将其放在 js 文件中并将引用放入布局中。
  • 由于您已经有了一个包装器,因此添加另一个名为 events 的属性并将其保存为数组。您可以将任意数量的函数推送到此数组中,并且在您的函数$.connection.somehub.client.event =function (){... 中,您可以循环数组并执行每个函数。
  • 改写:“我不希望我的视图依赖于布局中的 JavaScript。”在我们的解决方案中,我们不时切换布局文件,如果我在布局文件中有这个,我会在所有这些中都有参考。我希望我创造的观点能够自我维持。我不希望 eventOne、eventTwo 和 eventThree 相互了解或从同一个地方调用:)

标签: javascript signalr


【解决方案1】:

在尝试了许多不同的事情后,我设法正确使用了 .on( 命令。它是这样完成的:

signalRClient.connection.somehub.on("someevent", function(item) {
    console.log(item);
});

signalRClient.connection.somehub.on("someevent", function (item) {
    console.log(item);
});

这将为每个事件在控制台中提供两行。

【讨论】:

  • 这很好。 SignalR 文档没有显示这一点。 asp.net/signalr/overview/guide-to-the-api/…
  • 确实如此,但它是以一种相当隐蔽的方式。如果您查看“没有生成的代理”标头,它会创建 hubproxy 并添加一个 .on( 事件。这是我花了很长时间才理解的原因,我可以将它与强类型版本“使用生成的代理”混合使用他们似乎不是问题:)
  • @Bjørn ...您能否澄清一下“somehub”是什么...我认为它是您要连接的集线器的名称,但我似乎没有具有该名称的对象在我的连接中。
  • 我这样做已经有一段时间了,但从记忆中它是您将使用的生成代理。事件名称在这里以相同的方式使用:$.connection.someHubName.client.someEventName,如果你还没有定义这个,我相信你可以做 var someHubProxy = connection.createHubProxy('someHub') 文档应该是直接的这部分:docs.microsoft.com/en-us/aspnet/signalr/overview/…
猜你喜欢
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
相关资源
最近更新 更多