jQuery SignalR client.off()函数只删除上次注册的回调
jQuery SignalR client .off() function only removes last registered callback
我在应用程序中使用SignalR,以允许我的ASP.NET Server应用程序将数据推送到我的Angular SPA web客户端。在web应用程序中,我包含了jquery.signalR-2.2.0.js文件。我不在http://serverurl/signal/hubs上使用自动生成的代理。
Web应用程序有多个可重用的小部件(指令),每个小部件都有自己的独立作用域。同一个小部件/指令的多个实例需要注册一个回调,该回调可以由服务器的SignalR Hub执行,所以我有这样的功能:
var on = function (eventName, callback) {
proxy.on(eventName, callback);
};
这个函数在一个单独的服务中,它也有连接和代理对象,到目前为止一切都很好。。。
从一个负责小部件实例的角度控制器,上面的函数被调用如下:
var callback = function (){
console.log('Callback fired on controller with Id' + $scope.id)
}
proxyHub.on('myEvent',callback);
控制器处于独立的范围内,因此var回调对于每个控制器都是不同的对象。
我能够从不同的控制器为同一事件注册多个回调,并且一切仍按预期工作。
现在我需要从控制器实例中注销回调,所以我在单独的服务中有以下方法:
var off = function(eventName,callback) {
proxy.off(eventName,callback);
};
它从这样一个特定的控制器实例调用:
//callback is exactly the same variable as used in the .on function for this controller
hubProxy.off('myevent',callback);
问题来了:只有最后一个注册的回调被从事件中删除。所有其他已注册的回调仍在被调用。如果我再次尝试调用.off函数,则不会发生任何事情,并且我无法注销其他回调。
主要问题是:如何注销事件中的特定回调???
从hubs源代码来看,似乎不可能取消订阅单个事件的多个重复回调。
这是on
函数的源代码:
on: function (eventName, callback) {
/// <summary>Wires up a callback to be invoked when a invocation request is received from the server hub.</summary>
/// <param name="eventName" type="String">The name of the hub event to register the callback for.</param>
/// <param name="callback" type="Function">The callback to be invoked.</param>
var that = this,
callbackMap = that._.callbackMap;
// Normalize the event name to lowercase
eventName = eventName.toLowerCase();
// If there is not an event registered for this callback yet we want to create its event space in the callback map.
if (!callbackMap[eventName]) {
callbackMap[eventName] = {};
}
// Map the callback to our encompassed function
callbackMap[eventName][callback] = function (e, data) {
callback.apply(that, data);
};
$(that).bind(makeEventName(eventName), callbackMap[eventName][callback]);
return that;
},
正如您所看到的,"event:callback"对被保存到callbackMap
并绑定到hub。如果您多次调用它,callbackMap
将被相同的值覆盖,但回调将被绑定多次。
在off
功能中:
off: function (eventName, callback) {
/// <summary>Removes the callback invocation request from the server hub for the given event name.</summary>
/// <param name="eventName" type="String">The name of the hub event to unregister the callback for.</param>
/// <param name="callback" type="Function">The callback to be invoked.</param>
var that = this,
callbackMap = that._.callbackMap,
callbackSpace;
// Normalize the event name to lowercase
eventName = eventName.toLowerCase();
callbackSpace = callbackMap[eventName];
// Verify that there is an event space to unbind
if (callbackSpace) {
// Only unbind if there's an event bound with eventName and a callback with the specified callback
if (callbackSpace[callback]) {
$(that).unbind(makeEventName(eventName), callbackSpace[callback]);
// Remove the callback from the callback map
delete callbackSpace[callback];
// Check if there are any members left on the event, if not we need to destroy it.
if (!hasMembers(callbackSpace)) {
delete callbackMap[eventName];
}
} else if (!callback) { // Check if we're removing the whole event and we didn't error because of an invalid callback
$(that).unbind(makeEventName(eventName));
delete callbackMap[eventName];
}
}
return that;
},
该"事件:回调"对在off
函数的第一次调用时从callbackMap
中删除,并从集线器解除绑定(一次)。但在下一次调用中,"event:callback"对不再存在,所以所有其他事件仍然绑定到hub。
一种解决方案可以是从事件中删除所有回调,只使用myEventName
调用off
函数,而不指定回调。但我不确定这是否适用于你的情况。
- 使用php或javascript从facebook相册URL中删除多余的部分
- RegEx删除空属性?例如,如果(class=“”||class=“”)移除;否则就下课
- 如何删除多行HTML排列中的空白
- 如何从rails中的代码中删除新行( )
- 删除对HTML元素的拖动
- 当图像转换为本地存储的DataURL时,EXIF被删除
- 按顺序添加和删除类
- iframe正在添加标签,需要删除它们
- 如何在HTML输入字段中添加不可删除的后缀
- addData()从最新图表中删除.js 2.1.3-怎么了
- 如何覆盖锚点元素's href目标,并在我点击转到目标javascript时删除其他错误
- 删除CKEditor工具栏按钮,但不删除功能
- 当浏览器上的后退按钮到达主页时,我需要删除Class
- 如何从npm注册表中删除npm包
- 如何通过按 id 注册但未在任何 DOM 节点中引用来删除 dojo 小部件
- 从尚未注册到 DOM 的 jquery 对象中删除元素
- 如何在 opencart 2.1 中删除注册帐户表单的电子邮件验证
- jQuery SignalR client.off()函数只删除上次注册的回调
- 套接字.如何删除onConnect上注册的猫鼬事件侦听器
- 从页面/注册表中删除聚合物元素的推荐方法是什么