2016-07-21 4 views
0

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

ответ

0

Вы можете сначала отключить концентратор, вызвав self.hop.stop(); функция