Angular с 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 может быть?
Ответы
Ответ 1
$scope
не существует в этом контексте, как то, что вводится при создании контроллера и создается новая область для дочерних элементов. Тем не менее, $rootScope
доступен в то время, когда вам нужно.
Кроме того, знайте, что $emit()
идет вверх, а области вашего контроллера не видят его. Вам нужно либо переключиться на $broadcast()
, чтобы событие переместилось вниз, либо добавило $rootScope
, а также к контроллерам, которые вы хотите подписаться на 'numberOfIncidents'
Ознакомьтесь с angular docs и полезной вики на облаках.
Ответ 2
Вот отличный пример, показывающий, как обернуть прокси-сервер в службе и использовать $rootScope
для события pub/sub.
http://sravi-kiran.blogspot.com/2013/09/ABetterWayOfUsingAspNetSignalRWithAngularJs.html
Ответ 3
Как уже отмечалось в johlrich answer, $scope
недоступно внутри proxy.on
. Однако просто переход на $rootScope
, скорее всего, не сработает. Причина этого в том, что обработчики событий, зарегистрированные с помощью proxy.on, вызывают код вне рамки angular, и поэтому angular не обнаружит изменений в переменных. То же самое относится к $rootScope. $Для обработчиков событий, которые запускаются событиями, транслируемыми из обработчиков событий SignalR. Подробнее см. https://docs.angularjs.org/error/$rootScope/inprog.
Таким образом, вы хотите вызвать $rootScope.$apply()
из обработчика событий 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);
});