【发布时间】: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 hub 和 SignalR 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