我有一个简单的应用程序,它显示了可用的signalR集线器的列表。用户选择一个集线器并连接到它,这将订阅一个事件以将消息添加到页面上的表中。然后,用户可以向该集线器发送消息,该集线器也将触发订阅,并将该消息添加到表中。这一切都很好用。
现在,如果用户选择另一个集线器,应用程序将连接并设置新的订阅,但是原始订阅仍会触发,导致重复的消息被添加到表中。每次更改集线器时,都会添加更多的订阅,从而导致一次发送会导致表中出现许多消息。
我尝试断开集线器的连接,处理集线器,并尝试使用hubProxy.off(eventName)删除订阅,但除了页面重新加载之外,似乎什么都不起作用。
这是我刚刚添加的onHub更改函数的代码,因为这是所有事情发生的地方。
任何想法都很感谢。:)
function HubViewModel() {
var self = this;
self.hubConnection = '';
self.hub = '';
$.getScript("../signalR/hubs");
self.hubs = ko.observableArray();
self.selectedHub = ko.observable();
self.messageText = ko.observable();
self.messageCollection = ko.observableArray();
self.hubChanged = function () {
// Setup hub connection.
$.connection.hub.url = "../signalR";
self.hubConnection = $.hubConnection();
// Get the selected hub name.
var selectedHubName;
_.each(self.hubs(), function(item) {
if (item.hubId == self.selectedHub()) {
selectedHubName = item.hubName;
}
});
// Check for a selected connection
if (self.selectedHub()) {
// Create proxy.
self.hub = self.hubConnection.createHubProxy(selectedHubName);
// Remove any existing listener(s).
self.hub.off('addNewMessageToPage');
// Setup listener.
self.hub.On('addNewMessageToPage', function (sender, message) {
self.messageCollection().push({ hubName: selectedHubName, name: selectedHubName, message: message, dateTime: new Date().toLocaleString() });
$('#hubMessageGrid').dxDataGrid('instance').refresh();
});
// start connection.
self.hubConnection.start()
.done(function() {
toastr.success('hub connected');
$('#sendMessageButton').click(function() {
self.hub.invoke('sendAll', 'hub management page', self.messageText());
self.messageText('');
});
})
.fail(function(error) {
toastr.error('hub connection ' + error);
});
}
};发布于 2016-09-21 19:54:10
您可以通过调用self.hub.stop();函数首先断开集线器
发布于 2021-05-06 18:35:41
您需要在取消订阅时传递完全相同的处理程序实例。传递一个不同的实例(即使函数体是相同的)不会删除处理程序。请参阅https://docs.microsoft.com/en-us/javascript/api/@microsoft/signalr/hubconnection?view=signalr-js-latest#off-string---args--any-------void-
https://stackoverflow.com/questions/38509756
复制相似问题