我正在玩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?
答案 0 :(得分:5)
$scope
在此上下文中不存在,因为在创建控制器并创建新的子范围时会注入该内容。但是,$rootScope
可在您需要时使用。
另外,请注意$emit()
向上,控制器范围不会看到它。您可能需要切换到$broadcast()
,以便事件向下或向您希望能够订阅的控制器$rootScope
注入'numberOfIncidents'
答案 1 :(得分:3)
这是一个很好的示例,展示如何在服务中包装代理并使用$rootScope
用于事件pub / sub。
http://sravi-kiran.blogspot.com/2013/09/ABetterWayOfUsingAspNetSignalRWithAngularJs.html
答案 2 :(得分:1)
正如johlrich's answer中所述,$scope
中proxy.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,因为我需要此解决方案。