2016-11-15 1 views
1

Ich habe einige Probleme mit den Handshake-Daten in meiner angularjs/ionic-Anwendung, wenn ich einen Benutzer wieder mit meiner socket.io Quiz-Anwendung verbinde.Update socket.io Handshake-Daten bei Verwendung von angular factory

Ich möchte die Handshake-Daten, die ich vom Client bei der Verbindung zu meinem Server sende, aktualisieren, wenn ein Benutzer trennt und dann wieder verbindet. (Ich brauche einige Daten in der Handshake, da der Server überprüft, ob der Benutzer zum ersten Mal beitritt, oder gerade verlor ihre Verbindung mit dem Quiz)

Mein Problem/was jetzt passiert:

  1. Ein Benutzer möchte mit id-Quiz teilnehmen "12345"
  2. der Benutzer mit dem Server verbunden, Handshake-Daten zu senden: {user_id: 1, quiz_code: 12345}
  3. Server fügt dann der Benutzer "1" Quiz-Nummer "12345"
  4. Wenn das Quiz endet, verwendet der Benutzer io.disconnect() und verlässt das Quiz
  5. Der Benutzer entscheidet sich nun, das Quiz "66666"
  6. Jetzt die Socket Factory scheint sich an den alten Handshake erinnern.
  7. Also, wenn der Client mit dem Server verbinden es {user_id: 1, quiz_code: 12345} sendet aber sollte {user_id: 1, quiz_code: 66666}

Mein Angularjs-Controller

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

}); 

My Angularjs Buchse Fabrik senden

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

Also 3 questio ns:

  1. Ich weiß, Fabriken sind Singletons, aber kann ich die Daten in meiner Fabrik aktualisieren?
  2. Kann ich das Werk zu meinem Controller "neu einspritzen" oder das Werk "zurücksetzen", wenn der Benutzer den Controller betritt.
  3. Gibt es einen besseren Weg, es vielleicht zu tun?

Antwort

1

Fabriken nicht Notwendigkeit Singletons zu sein, und in Ihrem Fall würde ich in der Tat sich nicht den Eindruck erwecken zu sein. Um das zu tun, was Sie tun müssen, ist, wickeln Sie Ihre Fabrik Logik innerhalb einer Funktion, wie folgt aus:

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

Auf diese Weise können Sie zuordnen $scope.socketService = SocketConnect() jedes Mal wenn Sie möchten, dass Ihre Fabrik zurückgesetzt, wie Sie ein Instanziierung würde neues Objekt

+0

Danke! Genau was ich brauchte ... – OngoBoingo

+0

Wie wenn ich Abfrageparameter unter Verwendung der Daten von der Datenbank einfügen möchte? Ich benutze $ http.get, um die Daten zu erhalten, aber der Socket-Rückgabewert wartet nicht auf die zu ladenden Daten ... –

Verwandte Themen