带信号器的AngularJS

带信号器的AngularJS,angularjs,signalr,Angularjs,Signalr,我在玩Angular和Signaler,我试图创建一个服务,作为一个经理 dashboard.factory('notificationsHub', function ($scope) { var connection; var proxy; var initialize = function () { connection = $.hubConnection(); proxy = connection.createHubProxy('notification');

我在玩Angular和Signaler,我试图创建一个服务,作为一个经理

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
  };
});

但是,我得到了错误:未知提供程序:$scopeProvider
$scope
在此上下文中不存在,因为这是在创建控制器并创建新的子作用域时注入的内容。但是,
$rootScope
在您需要时可用

另外,请注意,
$emit()
向上移动,您的控制器作用域将看不到它。您可能需要切换到
$broadcast()
以便事件向下移动,或者将
$rootScope
以及您希望能够订阅
'numberofevents'


查看和。

这里是一个很好的示例,展示了如何在服务中包装代理,并使用
$rootScope
进行事件发布/订阅

如中所述,
$scope
代理中不可用。然而,仅仅切换到
$rootScope
很可能不起作用。这是因为使用proxy.on调用的事件处理程序registresred由angular框架之外的代码调用,因此angular不会检测到变量的更改。这同样适用于由信号器事件处理程序广播的事件触发的事件处理程序上的$rootScope.$。有关更多详细信息,请参阅

因此,您希望从信号器事件处理程序显式调用
$rootScope.$apply()

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);
});
在更改值之后,我尝试使用$apply(),我尝试使用$apply(functuin(){value=3}),我还尝试使用$emit和$broadcast来更改值,但没有任何帮助。 但我在控制器中找到了我们需要的html解决方案

var scope2 = angular.element("#test").scope();
    scope2.point.WarmData.push(result);
    $scope.$apply();

另外,我知道这是一个非常古老的问题,但可能是smb提出的,因为我需要这个解决方案。

对于信号机应用程序,我特别推荐
$emit
+
$rootScope.$on
路径,原因如下所述:老实说,我不想使用这个示例。他使用的服务只有一半的逻辑;另一半(订阅服务器上的
$)被烘焙到他的控制器中。很好的一点是,示例的亮点是代理的包装。但订阅者不会在任何需要他们的地方吗?在这个更新$scope上属性的示例中,逻辑应该放在哪里?您可以顺便看看我在github上的最新推送:。它基本上支持原始Signalr js客户端的所有功能,我添加了一个killer功能,它可以将事件正确地传播到Angular的scope系统中。如何为此编写jasmine单元测试用例?