2016-11-15 29 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來獲取數據,但套接字返回值沒有等待數據被加載... –