首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用SignalR的AngularJS

使用SignalR的AngularJS
EN

Stack Overflow用户
提问于 2013-11-19 04:03:32
回答 4查看 22K关注 0票数 13

我正在使用Angular和SignalR,我试图创建一个服务,它将作为一个管理器。

代码语言:javascript
复制
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?

EN

回答 4

Stack Overflow用户

发布于 2013-11-19 04:49:17

$scope不存在于此上下文中,因为它是在创建控制器和创建新的子作用域时注入的。但是,$rootScope在您需要的时候是可用的。

另外,要知道$emit()是向上的,你的控制器作用域看不到它。您可能需要切换到$broadcast()以便事件向下进行,或者将$rootScope也注入到您希望能够订阅'numberOfIncidents'的控制器

看看angular docsuseful wiki on scopes吧。

票数 5
EN

Stack Overflow用户

发布于 2013-12-10 00:59:26

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

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

票数 3
EN

Stack Overflow用户

发布于 2014-08-04 21:43:42

正如在johlrich's answer中已经提到的,$scopeproxy.on中不可用。然而,仅仅切换到$rootScope很可能行不通。这样做的原因是因为使用proxy.on注册的事件处理程序由angular框架外的代码调用,因此angular不会检测到变量的更改。这同样适用于由从SignalR事件处理程序广播的事件触发的$rootScope.$on事件处理程序。有关更多细节,请参阅https://docs.angularjs.org/error/$rootScope/inprog

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

代码语言:javascript
复制
proxy.on('numberOfIncidents', function (numOfIncident) {
  console.log(numOfIncident);
  $scope.$apply(function () {
    $rootScope.$emit('numberOfIncidents', numOfIncident);
  });
});

或者可能隐式地通过$timeout

代码语言:javascript
复制
proxy.on('numberOfIncidents', function (numOfIncident) {
  console.log(numOfIncident);
  $timeout(function () {
    $rootScope.$emit('numberOfIncidents', numOfIncident);
  }, 0);
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20056743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档