Angular с SignalR

Я играю с Angular и SignalR, я попытался создать службу, которая будет действовать как менеджер.

dashboard.factory('notificationsHub', function ($scope) {
  var connection;
  var proxy;

  var initialize = function () {
    connection = $.hubConnection();
    proxy = connection.createHubProxy('notification');

    proxy.on('numberOfIncidents', function (numOfIncident) {
      console.log(numOfIncident);
      $scope.$emit('numberOfIncidents', numOfIncident);
    });

    connection.start()
      .done(function() {
        console.log('Connected');
      })
     .fail(function() { console.log('Failed to connect Connected'); });
  };

  return {
    initialize: initialize
  };
});

однако я получаю ошибку Error: Unknown provider: $scopeProvider <- $scope <- notificationsHub.

Как я могу использовать pubsub для передачи всех уведомлений контроллерам? jQuery может быть?

Ответ 1

$scope не существует в этом контексте, как то, что вводится при создании контроллера и создается новая область для дочерних элементов. Тем не менее, $rootScope доступен в то время, когда вам нужно.

Кроме того, знайте, что $emit() идет вверх, а области вашего контроллера не видят его. Вам нужно либо переключиться на $broadcast(), чтобы событие переместилось вниз, либо добавило $rootScope, а также к контроллерам, которые вы хотите подписаться на 'numberOfIncidents'

Ознакомьтесь с angular docs и полезной вики на облаках.

Ответ 3

Как уже отмечалось в johlrich answer, $scope недоступно внутри proxy.on. Однако просто переход на $rootScope, скорее всего, не сработает. Причина этого в том, что обработчики событий, зарегистрированные с помощью proxy.on, вызывают код вне рамки angular, и поэтому angular не обнаружит изменений в переменных. То же самое относится к $rootScope. $Для обработчиков событий, которые запускаются событиями, транслируемыми из обработчиков событий SignalR. Подробнее см. https://docs.angularjs.org/error/$rootScope/inprog.

Таким образом, вы хотите вызвать $rootScope.$apply() из обработчика событий SignalR, либо явно

proxy.on('numberOfIncidents', function (numOfIncident) {
  console.log(numOfIncident);
  $scope.$apply(function () {
    $rootScope.$emit('numberOfIncidents', numOfIncident);
  });
});

или, возможно, неявно через $timeout

proxy.on('numberOfIncidents', function (numOfIncident) {
  console.log(numOfIncident);
  $timeout(function () {
    $rootScope.$emit('numberOfIncidents', numOfIncident);
  }, 0);
});