2016-11-15 6 views
1

У меня возникли проблемы с данными рукопожатия в моем приложении angularjs/ionic, когда я снова подключу пользователя к моей викторине socket.io.Обновление данных сокета co.io при использовании угловой фабрики

Я хотел бы обновить данные рукопожатия, которые я отправляю от клиента при подключении к моему серверу, если пользователь отключается, а затем снова подключается. (мне нужно некоторые данные в рукопожатии, поскольку сервер проверяет, если пользователь присоединяется в первый раз, или просто потерял свою связь с викториной)

Моей проблемой/Что происходит сейчас:

  1. пользователь хочет присоединиться к викторине с идентификатором «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 для получения данных, но значение возвращаемого сокета не ожидает загрузки данных ... –