2017-12-05 1 views
1

여러 상태 (경로)가있는 Angular JS 응용 프로그램을 백 엔드에서 실행중인 노드 서버 (소켓)와 연결하고 있습니다. 다른 상태를 방문하여 소켓 코드가 작성된 상태로 돌아 오면 다시 등록되고 이벤트가 발생하면 여러 번 함수가 호출되어 성능에 영향을줍니다. AngularJS 응용 프로그램에서 상태 전환시 소켓 이벤트가 여러 번 발생합니다.

var socket = io.connect('127.0.0.1:3000'); 

     socket.on("connect",function(){ 
      console.log("connected"); 
     }); 


      socket.on("test-channel:App\\Events\\NewMessage", function(message) { 
       if (vm.questions.length < 3) { 

        console.log("question fetching started"); 
        vm.fetch_q(); 

       } 
      }); 

는 또한 서비스의 io.connect ('로컬 호스트')를 넣어 시도하고 컨트롤러에서 이벤트 만 넣어,하지만 또한 여러 번 해고된다.

+0

무엇이 당신의 질문입니까? 컨트롤러를로드 할 때마다 'var socket = io.connect ('127.0.0.1:3000');'명령을 포함하여 내부의 코드가 실행되므로 서버에 다시 연결하려고 시도합니다. 연결 코드를 별도의 서비스로 이동하고 앱 전체에서 서비스를 사용하십시오. – Elad

+0

나는 넣어 봤는데 var socket = io.connect ('127.0.0.1:3000'); 또한 서비스에 넣고 socket.on ('event', function() {}) 이벤트를 컨트롤러에 넣고 여러 번 호출하게됩니다. 문제는 socket.on ("connect", function() { alert ("connected"); })입니다. 페이지를 다시 방문 할 때마다 이벤트가 시작됩니다. –

답변

0

문제는 컨트롤러가 해당 컨트롤러에 액세스 할 때마다 'on'이벤트를 설정하고 새로 고침 할 때만 제거한다는 것입니다. 당신이 AngularJS와를 사용하는 경우

당신은 단순히 당신이 이벤트를들을 수 있지만 onemit의 insted 사용할 때 $rootScope.socket = io.connect('127.0.0.1:3000'); 다음이 $rootScope.socket.emit('event', {});, 같은 방법처럼 컨트롤러에서 사용할 선언 할 수 있습니다.

어쨌든, 이것은 성능과 프로그램 개발 방법을 향상시키는 방법이지만 이벤트 리스너를 컨트롤러에 유지하는 것이 좋지 않기 때문에 질문의 문제가 여전히 남아 있습니다. 뭔가를 내라.

AngularJS Run 서비스의 이벤트 리스너를 사용하여 문제를 해결할 수 있습니다. 당신이 모듈에서 이벤트를 선언 할 수 있습니다 청취하기 위해 더 많은 이벤트가있는 경우

app.run(function($rootScope){ 
    $rootScope.socket.on('event', function(){ 
    // Do something.. 
    }); 
} 

는 그리고 run 서비스 모듈을 필요로한다. 희망은 당신을위한 좋은 해결책이 될 수 있습니다.

관련 문제