使用AngularJS获取SignalR发送的值

时间:2017-11-15 23:09:06

标签: angularjs signalr asp.net-core-mvc asp.net-core-signalr

我试图在屏幕上写一条非常简单的消息,当发送一个值时,此消息会更新。

我有一个非常简单的中心:

public class Chat : Hub
{
    public Task Send(string message)
    {
        return Clients.All.InvokeAsync("Send", message);
    }
}

在前端,我有以下

<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 个答案:

答案 0 :(得分:1)

使用观察者模式。基本上创建一个应该做以下事情的服务:

  1. 创建集线器连接(处理启动,重新连接,....)
  2. 支持以下方法:

    • 注册事件(将调用者添加到包含
      的列表中 感兴趣的成员。)
    • 取消注册事件(从列表中删除调用者与成员。)
  3. 如果来自服务器的新消息通知所有观察者
  4. 示例:

    (从我的解决方案中提取的伪代码(大到显示全部)):

    服务器(此处称为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();
                    });
            }
    

    在您的Controller中(注入服务并注册事件):

    hubWrapperServer.registerToEvent(function () {
            serviceHub.getAllDevices().then(function (params) {    // Do something in your controller
            });
          });
    

    还有一个包装服务可用 https://github.com/JustMaier/angular-signalr-hub

答案 1 :(得分:0)

poker.client.showAllCards = function (show) {  
    $scope.allCardsShowing = show;
    $scope.$apply();
};

$scope.$apply(),刷新Angularjs上下文,这对我有用。

我收到以下表单文章:Consensus: SignalR + AngularJS