2017-01-02 6 views
0

私は、私は、ユーザーが自分のアプリケーションからの接続または切断時にサーバーから呼び出されるメソッドを持っ角度サービスを持っている角度クライアント

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

私の質問は次のとおりです。それは生成されたプロキシで作ることが可能ですか、私は非常に身近ではないそれらのメソッドに非生成のプロキシアクセスを使用する必要があります。生成されたプロキシで

私は、それは誰も応答しなかったので、コントローラスコープ

答えて

0

に私のデータを更新するために、私のコントローラメソッドに到達しない上に示したように、私は何とか奇妙なものを見つけます。私はこれが働いていることを知りました。私はこれが良いaproachであるかどうかは分かりません。なぜなら誰も答えず、どのようにこれを解決すべきなのかわからないからです。

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