0

각도 라우팅에 UI 라우터를 사용하고 있습니다. $ state.go()가 호출 될 때마다 컨트롤러의 새 인스턴스가 생성됩니다. 여기에 $ rootScope 이벤트가 있습니다. 그래서 언제든지 (console.log()를 사용하여) 모든 로그를 인쇄하거나 컨트롤러 외부에서 이벤트를 트리거하려는 경우 컨트롤러의 인스턴스와 동일한 시간 수만큼 여러 번 실행합니다. 이 문제를 어떻게 해결할 수 있습니까? 한 번만 실행하고 싶습니다. 모든 종류의 도움을 주시면 감사하겠습니다. 미리 답변 해 주셔서 감사합니다. 코드 스 니펫

$rootScope.$on('connect_device',function() { 
     connect_device($rootScope.mac_address,$rootScope.device_name);  
    }); 

다른 컨트롤러에서 방출하고 있습니다.

$rootScope.$emit("connect_device") 
+2

코드를 제공해 주실 수 있습니까? – Mistalis

답변

0

귀하의 컨트롤러 인스턴스에서 일부 destroy 처리가 누락되었습니다. $rootScope으로 침몰 한 이벤트는 파기시 구독을 취소해야합니다. 컨트롤러는 실제로 $state.go에 생성되고 이벤트 목록은 각 컨트롤러 생성 단계에 첨부됩니다. 이러한 이벤트 리스너를 파괴하지 않으면 이러한 동작이 발생합니다.

문제를 해결할 수있는 방법을 알려면 다음 샘플 코드를 참조하십시오. 파괴 $에서 cleanUpFunc()를 호출하여

angular.module('moduleName') 
    .controller('controllerName', ['$rootScope', '$scope', function ($rootScope, $scope) { 

    var cleanUpFunc = $rootScope.$on('eventName', function { 
     // listener actions 
    }); 

    $scope.$on('$destroy', function() { 
     cleanUpFunc(); 
    }); 

}]); 

eventName 이벤트에 대한 이벤트 리스너는-유엔 가입되며 컨트롤러가 정리됩니다 때 더 이상 메모리가 누수되지 않습니다.

이벤트가 파손되지 않으면 컨트롤러가 이미 삭제 된 경우에도 이벤트 목록 수신기가 계속 활성 상태입니다. 그리고 가능한 결과로 한 이벤트에서 여러 함수를 호출 할 수 있습니다.

실제 코드 예제가 없어도 다음은 컨트롤러 destroy에서 events을 어떻게 처리해야하는지 보여줍니다.

+0

daan.desmedt에게 답변 해 주셔서 감사합니다. 나는 방법을 시도했지만 문제가 해결되지 않았습니다. 같은 페이지로 다시 방문하면 이벤트가 두 번 실행됩니다. –

+0

몇 가지 코드를 공유 할 수 있습니까? 관련 코드를 보지 않아도 해결하기가 어렵습니다. 파괴되는 사건에 대해 얼마나 확신하십니까? 아마도'console.logs'를 사용하여 파괴 된 컨트롤러가 여전히 이벤트 리스너를 처리하는지 확인하십시오. –

관련 문제