2016-11-15 56 views
1

当我将用户重新连接到我的socket.io测验应用程序时,我在我的angularjs/ionic应用程序中握手数据时遇到了一些问题。使用角度工厂时更新socket.io握手数据

我想更新我连接到服务器时从客户端发送的握手数据,如果用户断开连接并再次连接。 (我需要一些数据在握手,因为服务器检查用户是否加盟的第一次,或者只是失去了连接测验)

我的问题/现在发生了什么:

  1. 用户想加入竞猜ID为“12345”
  2. 将用户连接到我的服务器,发送握手数据:{user_id: 1, quiz_code: 12345}
  3. 服务器然后将用户“1”竞猜号码“12345”
  4. 测验结束后,用户使用io.disconnect()并离开测验
  5. 用户现在决定加入测验“66666”
  6. 现在套接字工厂似乎记住了旧的握手。
  7. 因此,当客户端连接到它发送{user_id: 1, quiz_code: 12345},但应该有服务器发送{user_id: 1, quiz_code: 66666}

我angular.js控制器

.controller('QuizCtrl', function(SocketService) { 

    $scope.$on('$ionicView.enter', function(e) { 
     //this seems to be the problem -> it reuses the old data in the factory 
     SocketService.connect(); 
    }); 

    $scope.$on('$ionicView.leave', function(e) { 
     SocketService.removeListener(); 
     SocketService.disconnect(); 
    }); 

}); 

我angular.js套接字工厂

.factory('SocketService', function(socketFactory){ 

    var data = { 
     activeQuiz : {quiz_code: 12345, quiz_ip: some.ip}, 
     currentUser : {user_id: 1} 
    }; 
    //This data is loaded from localStorage in the application, so it can be changed 

    var myIoSocket = io.connect(data.activeQuiz.ip, {query: 'user_id='+data.currentUser.user_id+'&quiz_code='+data.activeQuiz.quiz_code}); 

    mySocket = socketFactory({ 
     ioSocket: myIoSocket 
    }); 

    return mySocket; 
}) 

所以3个问题ns:

  1. 我知道工厂是单身人士,但我可以更新我工厂的数据吗?
  2. 当用户进入控制器时,可以将工厂“重新注入”我的控制器或“重置”工厂。
  3. 有没有更好的方法来做到这一点?

回答

1

工厂不需要需要是单身人士,在你的情况下,我确实建议他们不要。要做到这一点,所有你需要做的是包装你的工厂的逻辑函数内部,就像这样:

.factory('SocketService', function(socketFactory){ 
    var init = function() { 
     var data = { 
      activeQuiz : {quiz_code: 12345, quiz_ip: some.ip}, 
      currentUser : {user_id: 1} 
     }; 
     //This data is loaded from localStorage in the application, so it can be changed 

     var myIoSocket = io.connect(data.activeQuiz.ip, {query: 'user_id='+data.currentUser.user_id+'&quiz_code='+data.activeQuiz.quiz_code}); 

     mySocket = socketFactory({ 
      ioSocket: myIoSocket 
     }); 

     return mySocket; 
    } 
    return init 
}) 

这种方式,你可以指定要重置您的工厂$scope.socketService = SocketConnect()每次,你会被实例化新对象。

+0

谢谢!正是我所需要的... – OngoBoingo

+0

如果我想要使用数据库中的数据插入查询参数?我使用$ http.get来获取数据,但套接字返回值没有等待数据被加载... –