使用jQuery的回调,而不是RPC在SignalR枢纽
问题描述:
我需要从不同的地方订阅同一集线器几次,例如:使用jQuery的回调,而不是RPC在SignalR枢纽
function firstPlace(targetHub){
targetHub.client.onSomeEvent = function(data){
alert('hello from first place');
};
}
function secondPlace(targetHub){
targetHub.client.onSomeEvent = function(data){
alert('hello from second place');
};
}
firstPlace($.connection.clientHub);
secondPlace($.connection.clientHub);
我想基于回调(如jquery callbacks)拥有的功能。
function firstPlace(targetHub){
targetHub.client.onSomeEvent.add(function(data){
alert('hello from first place');
});
}
function secondPlace(targetHub){
targetHub.client.onSomeEvent.add(function(data){
alert('hello from second place');
});
}
firstPlace($.connection.clientHub);
secondPlace($.connection.clientHub);
我知道它可以很容易地使用一些代理对象实现,但也许有一些JavaScript的魔术,我不知道?
答
如果你不帮自己,没有其他人会=)。下面是代码,是解决我的问题:
signalR.FunctionToCallback = new function() {
self.MapCallback = function (sourceFunction, targetCallback) {
if (!sourceFunction) {
sourceFunction = function() {
sourceFunction.callbacks.fireWith(this, $.makeArray(arguments));
};
}
if (!sourceFunction.callbacks) {
sourceFunction.callbacks = $.Callbacks();
}
sourceFunction.callbacks.add(targetCallback);
return sourceFunction;
};
};
用例:
function firstPlace(targetHub){
targetHub.client.onSomeEvent = ko.FunctionToCallback.MapCallback(targetHub.client.onSomeEvent,function(data){
alert('hello from first place');
});
}
function secondPlace(targetHub){
targetHub.client.onSomeEvent = ko.FunctionToCallback.MapCallback(targetHub.client.onSomeEvent, function(data){
alert('hello from second place');
});
}
firstPlace($.connection.clientHub);
secondPlace($.connection.clientHub);
答
你可以用我EventAggregator代理像
function firstPlace() {
signalR.eventAggregator.subscribe(MyApp.SomeEvent, this.onSomeEvent, this);
}
function secondPlace() {
signalR.eventAggregator.subscribe(MyApp.SomeEvent, this.onSomeEvent, this);
}
当然,图书馆有FEATURS,但这是其中之一
https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki
我读过你的wiki,有太多的功能,它的项目,我(我不想在服务器端对此功能进行任何配置更改)。是否有可能连接客户端侦听器只更改客户端?我试图自己初始化你的Event聚合器(var my aggregator = new signalR.EventAggregator();),但它会抛出多个错误(Uncaught TypeError:无法读取未定义jquery.signalR.eventAggregator-1.3.110.0.min的属性'client' .js:1 Uncaught TypeError:无法读取属性'genericConstructor'的未定义) – Ivan 2014-10-20 10:13:36