Signalr 具有信号服务而非消防控制器方法的角度客户端

Signalr 具有信号服务而非消防控制器方法的角度客户端,signalr,angular-services,Signalr,Angular Services,我有angular服务,当用户连接或断开与我的应用程序的连接时,我从服务器调用这些方法 (function () { //'use strict'; app.service('PrivateChatService', ['$rootScope', '$location', function PrivateChatService($rootScope, $location){ var online_users = []; var proxy = $.connection.chatH

我有angular服务,当用户连接或断开与我的应用程序的连接时,我从服务器调用这些方法

(function () {
//'use strict';
app.service('PrivateChatService', ['$rootScope', '$location', function PrivateChatService($rootScope, $location){
    var online_users = [];
    var proxy = $.connection.chatHub;

    return {
        addOnlineUser:
            proxy.client.newOnlineUser = function (user) {
                    var newUser = ({
                        connectionId: user.ConnectionId,
                        UserName: user.UserName
                    });
                    online_users.push(newUser);
                    $.connection.hub.start()
            },

            removeOfflineUser: proxy.client.onUserDisconnected = function (id, user) {
                var index = 0;
                //find out index of user
                angular.forEach(online_users, function (value, key) {
                    if (value.connectionId == id) {
                        index = key;
                    }
                })
                online_users.splice(index, 1);
                $.connection.hub.start()
            },

        }
}])})();
在这里,我得到了一个控制器方法,当服务器调用newOnlineUser时,我希望触发该方法

    PrivateChatService.newOnlineUser(function (user) {
        $scope.online_users.push(newUser);
        console.log("newOnlineUser finished");
    });
所以我的问题是。是否可以使用生成的代理进行访问,或者我必须使用非生成的代理访问那些我不太熟悉的方法


如我上面所示,使用生成的代理,我的控制器方法无法更新控制器范围内的数据,因为没有人响应,我发现有些奇怪。我发现这是可行的。我不确定这是否是一个好办法,因为没有人回答,我也没有找到任何应该如何解决的信息

app.service('PrivateChatService', ['$rootScope', '$location', function PrivateChatService($rootScope, $location){
    var online_users = [];        
    var connection = $.hubConnection();
    var proxy = connection.createHubProxy('chatHub');

    function signalrCall(eventName, callback) {
        proxy.on(eventName, function (user) {
            var args = arguments;
            $rootScope.$apply(function () {
                callback.apply(proxy, args)
            })
        });
        connection.start();
    }
    return {
        addOnlineUser: function (eventName, callback) {
            signalrCall(eventName, callback);               
        },

        getActiveUsers: function (eventName, callback) {
            signalrCall(eventName, callback);
        },

        removeOfflineUser: function (eventName, callback) {
            signalrCall(eventName, callback);
        }
    }
}])
角度控制器方法

    PrivateChatService.addOnlineUser("newOnlineUser", function (user) {
        var newUser = ({
            connectionId: user.ConnectionId,
            UserName: user.UserName
        });

        $scope.online_users.push(newUser);
        console.log("newOnlineUser finished");
    });

    PrivateChatService.getActiveUsers("getOnlineUsers", function (onlineUsers) {     
        angular.forEach($scope.online_users, function (scopeValue, scopeKey) {
            //loop through received list of online users from server
            angular.forEach(onlineUsers, function (serverListValue, serverListKey) {
                if (!(serverListValue.ConnectionId == scopeValue.connectionId)) {
                    var newUser = ({
                        connectionId: serverListValue.ConnectionId,
                        UserName: serverListValue.UserName
                    });
                    $scope.online_users.push(newUser);
                }
            })
        })
        console.log("getOnlineUsers finished");
    });

    PrivateChatService.removeOfflineUser("onUserDisconnected", function (user) {
            var index = 0;
            //find out index of user
            angular.forEach($scope.online_users, function (value, key) {
                if (value.connectionId == user) {
                    index = key;
                }
            })
            $scope.online_users.splice(index, 1);
    });