2014-01-08 3 views
2

내가 공장 myApp.factory ('소켓'여기 여기왜 내가

http://www.html5rocks.com/en/tutorials/frameworks/angular-websockets/ 브라이언 포드가 여기에 설명 된 소켓 팩토리를한다 사용하고 내 컨트롤러 가운데로 할 때마다 내 socket.on이 다중 호출 할, 내가 수신 socket.on 기능은 한 번 실행 다른 페이지에서이 컨트롤러를 다시 입력 할 때마다 내가 수동으로 새로 고칠 때까지 기능 ($ rootScope는) {

 var socket = io.connect('url'); 
     return { 
      on: function (eventName, callback) { 
       socket.on(eventName, function() { 
        var args = arguments; 
        $rootScope.$apply(function() { 
         callback.apply(socket, args); 
        }); 
       }); 
      }, 
      emit: function (eventName, data, callback) { 
       socket.emit(eventName, data, function() { 
        var args = arguments; 
        $rootScope.$apply(function() { 
         if (callback) { 
          callback.apply(socket, args); 
         } 
        }); 
       }) 
      } 
     }; 
    }); 

내 컨트롤러의 초기화 함수에 socket.emit을 가지고.이 문제가 발생합니다 페이지를 1로 리셋합니다. 명시 적으로 저장하지 않습니다. 소켓 세션. 그래서 내 소켓을 일으키는 원인이 될 수 있습니다. 여러 번 전화를 걸 때.

여기 내 컨트롤러의 소켓 .emt입니다. 항상 한 번 실행됩니다. 여기

$scope.init = funciton(){ 
... 
socket.emit('getSignedSlidesFromUrl', $scope.slideLocation); 
} 

'는 getSignedSlidesFromUrl'여기
socket.on('signedUrls', function (signedSlides){ 
      console.log('signedUrls socket hit'); 
      $scope.slides = signedSlides; 
      console.log($scope.slides[0]); 
      console.log($scope.display); 
     }); 

가 INIT 컨트롤러에서 컨트롤러

방출하려고 getSignedSlidesFromUrl 재진입 후의 내 콘솔 로그의 예를 받게되며 것이다 내 socket.on 인 .js : 71

display after called $scope.first slide is0 controllers.js:574 
flash object is controllers.js:537 
signedUrls socket hit controllers.js:816 
0 controllers.js:823 
signedUrls socket hit controllers.js:816 
0 controllers.js:823 

컨트롤러에 다시 내 로그 당신은 당신의 공장 removeAllListeners를 추가해야

signedUrls socket hit controllers.js:816 
0 controllers.js:823 
signedUrls socket hit controllers.js:816 
0 controllers.js:823 
signedUrls socket hit controllers.js:816 
0 controllers.js:823 

답변

6

로 변경됩니다 확보 (아래 참조)와 컨트롤러의 각에 다음 코드를 가지고 :

$scope.$on('$destroy', function (event) { 
    socket.removeAllListeners(); 
}); 

업데이트 소켓 팩토리 :

var socket = io.connect('url'); 
    return { 
     on: function (eventName, callback) { 
      socket.on(eventName, function() { 
       var args = arguments; 
       $rootScope.$apply(function() { 
        callback.apply(socket, args); 
       }); 
      }); 
     }, 
     emit: function (eventName, data, callback) { 
      socket.emit(eventName, data, function() { 
       var args = arguments; 
       $rootScope.$apply(function() { 
        if (callback) { 
         callback.apply(socket, args); 
        } 
       }); 
      }) 
     }, 
     removeAllListeners: function (eventName, callback) { 
      socket.removeAllListeners(eventName, function() { 
       var args = arguments; 
       $rootScope.$apply(function() { 
       callback.apply(socket, args); 
       }); 
      }); 
     } 
    }; 
}); 
+0

했다. 나를 안내 해줄 수 있니? 컨트롤러에 $ destory를 추가하고 소켓에 새로운 removeAllListeners() 메서드를 추가합니다. –

1

@ michaeljoser의 해결책을 시도했지만 나에게 도움이되지 못했습니다.

는 그럼 난 다른 해결책을 발견하고는
var socket = io.connect('url'); 
    return { 
     on: function (eventName, callback) { 
      socket.on(eventName, function() { 
       var args = arguments; 
       $rootScope.$apply(function() { 
        callback.apply(socket, args); 
       }); 
      }); 
     }, 
     emit: function (eventName, data, callback) { 
      socket.emit(eventName, data, function() { 
       var args = arguments; 
       $rootScope.$apply(function() { 
        if (callback) { 
         callback.apply(socket, args); 
        } 
       }); 
      }) 
     }, 
     getSocket: function(){ 
      return socket; 
     } 
    }; 
}); 

을했다 그리고 컨트롤러, 내가 같은 코드를 추가하지만 여전히 코드에 영향을주지 않습니다

$scope.$on('$destroy', function (event) { 
      socket.getSocket().removeAllListeners(); 
     });