AngularJS与SignalR

时间:2013-11-18 20:03:32

标签: angularjs 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?

4 个答案:

答案 0 :(得分:5)

$scope在此上下文中不存在,因为在创建控制器并创建新的子范围时会注入该内容。但是,$rootScope可在您需要时使用。

另外,请注意$emit()向上,控制器范围不会看到它。您可能需要切换到$broadcast(),以便事件向下或向您希望能够订阅的控制器$rootScope注入'numberOfIncidents'

查看angular docsuseful wiki on scopes

答案 1 :(得分:3)

这是一个很好的示例,展示如何在服务中包装代理并使用$rootScope用于事件pub / sub。

http://sravi-kiran.blogspot.com/2013/09/ABetterWayOfUsingAspNetSignalRWithAngularJs.html

答案 2 :(得分:1)

正如johlrich's answer中所述,$scopeproxy.on无法使用$rootScope。但是,切换到$rootScope.$apply()很可能无效。这样做的原因是因为使用proxy.on注册的事件处理程序由角度框架之外的代码调用,因此angular不会检测变量的变化。这同样适用于由SignalR事件处理程序广播的事件触发的事件处理程序上的$ rootScope。$。有关更多详细信息,请参阅https://docs.angularjs.org/error/$rootScope/inprog

因此,您希望从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); });

{{1}}

答案 3 :(得分:0)

更改值后,我尝试使用$ apply(),尝试使用$ apply(functuin(){value = 3}),并且尝试使用$ emit和$ broadcast更改值,但它没有没有帮助。 但是我在控制器中可以使用后找到了我们需要的HTML解决方案

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

P.s。我知道这是一个非常老的问题,但可能由于smb,因为我需要此解决方案。