Получение значения, отправленного SignalR с AngularJS
Я пытаюсь написать очень простое сообщение на экране, что, когда сигнализатор отправляет значение, это сообщение обновляется.
У меня очень простой хаб:
public class Chat : Hub
{
public Task Send(string message)
{
return Clients.All.InvokeAsync("Send", message);
}
}
На входе у меня есть следующий HTML:
<div ng-app="myApp" ng-controller="myCtrl">
<p ng-bind="value"></p>
</div>
И скрипт такой:
var app = angular.module('myApp', []);
app.controller('myCtrl', function ($scope) {
$scope.value = "My Test Value";
});
chatConnection.on('Send', (message) => {
app.scope.value = message;
});
Я не понимаю, как мне получить доступ к этому параметру значения, чтобы я мог его обновить.
РЕДАКТИРОВАТЬ:
Часть SignalR работает, сообщение приходит. Проблема в том, что я не уверен, как обновить значение, которое находится внутри этого контроллера. app.scope.value = message;
2 ответа
Используйте шаблон наблюдателя. В основном создайте сервис, который должен делать следующие вещи:
- Создает соединение с концентратором (обрабатывает запуск, переподключение,....)
Поддержите, например, следующие методы:
- зарегистрироваться на событие (добавляет звонящего в список, который содержит
заинтересованные участники.) - отменить регистрацию для события (удаляет абонента из списка с заинтересованными участниками.)
- зарегистрироваться на событие (добавляет звонящего в список, который содержит
- В случае появления нового сообщения с сервера сообщите всем наблюдателям
Пример:
(Псевдокод извлечен из моего решения (чтобы большой показать все)):
Сервер (здесь он называется hubWrapperService):
var yourHubProxy = $.connection.yourHub;
yourHubProxy.client.yourMethodWhichServerCanCall= function (params){
// Inform observers. Iterate to over all your observers and inform them
notifyObservers(params);
};
// Start connection.
$.connection.hub.start().done(function () {
...
});
}).fail(function (error) {...
});
function registerToEvent(callback) {
$log.debug("ServiceHub: getConnectionEvent called");
// Add caller to you observer list. (here serviceInitObservers)
}
function notifyServiceInitObservers() {
angular.forEach(serviceInitObservers, function (callback) {
callback.callback();
});
}
В вашем контроллере (ввести сервис и зарегистрироваться на события):
hubWrapperServer.registerToEvent(function () {
serviceHub.getAllDevices().then(function (params) { // Do something in your controller
});
});
Существует также услуга оболочки, доступная https://github.com/JustMaier/angular-signalr-hub
poker.client.showAllCards = function (show) {
$scope.allCardsShowing = show;
$scope.$apply();
};
$scope.$apply()
обновить контекст Angularjs, и это работает для меня.
Я получаю эту форму статьи: Консенсус: SignalR + AngularJS