使用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

+0

我读过你的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