У меня есть простое приложение, которое отображает список доступных концентраторов сигналов. Пользователь выбирает концентратор и подключается к нему, это подписывает событие для добавления сообщений в таблицу на странице. Затем пользователь может отправить отправленные сообщения в этот концентратор, который также упустит подписку, добавив это сообщение в таблицу. Все это прекрасно работает.SignalR change hub subscription
Теперь, если пользователь выбирает другой концентратор, приложение подключается и устанавливает новую подписку, однако исходная подписка по-прежнему срабатывает, что приводит к добавлению дублирующих сообщений в таблицу. Каждый раз, когда концентратор изменяется, добавляются дополнительные подписки, в результате чего одна отправка приводит к появлению многих сообщений в таблице.
Я попытался отключить концентратор, удалив концентратор и пытаясь удалить подписку с помощью 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);
});
}
};