我正在使用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?
发布于 2013-11-19 04:49:17
$scope
不存在于此上下文中,因为它是在创建控制器和创建新的子作用域时注入的。但是,$rootScope
在您需要的时候是可用的。
另外,要知道$emit()
是向上的,你的控制器作用域看不到它。您可能需要切换到$broadcast()
以便事件向下进行,或者将$rootScope
也注入到您希望能够订阅'numberOfIncidents'
的控制器
发布于 2013-12-10 00:59:26
这里有一个很好的示例,展示了如何将代理包装在服务中,并使用$rootScope
处理事件发布/订阅。
http://sravi-kiran.blogspot.com/2013/09/ABetterWayOfUsingAspNetSignalRWithAngularJs.html
发布于 2014-08-04 21:43:42
正如在johlrich's answer中已经提到的,$scope
在proxy.on
中不可用。然而,仅仅切换到$rootScope
很可能行不通。这样做的原因是因为使用proxy.on注册的事件处理程序由angular框架外的代码调用,因此angular不会检测到变量的更改。这同样适用于由从SignalR事件处理程序广播的事件触发的$rootScope.$on事件处理程序。有关更多细节,请参阅https://docs.angularjs.org/error/$rootScope/inprog。
因此,您希望从SignalR事件处理程序中显式调用$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);
});
https://stackoverflow.com/questions/20056743
复制相似问题