具有signalR服务的角度客户端不是火灾控制器方法

时间:2017-01-02 23:15:02

标签: signalr angular-services

我有角度服务,我有从用户连接或从我的应用程序断开连接时从服务器调用的方法

(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");
    });

所以我的问题是。是否可以使用生成的代理进行生成,或者我必须使用非生成的代理访问那些我不熟悉的方法。

如上所示使用生成的代理,它永远不会到达我的控制器方法来更新控制器范围内的数据

1 个答案:

答案 0 :(得分:0)

由于没有人回应,我发现有点奇怪。我发现这是有效的。我不确定这是不是很好,因为没有人回答,我没有找到任何信息应该如何解决。

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);
    });