2014-11-22 5 views
8

컨트롤러에 ui 라우터와 함께 $stateChangeStart을 사용하려고합니다. 해고 될 때마다 나타나는 것처럼 보입니다. 콜백은 마지막 시간보다 +1 시간을 더 많이 발생시킵니다.stateChangeStart 여러 번 트리거

$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){ 
    console.log('$stateChangeStart'); 
}); 

예를 들어 첫 번째 변경 시작시 console.log이 한 번 해고됩니다. 두번째로 console.log 두 번 해고 될 것입니다.

나는이 동작을 멈추게 할 것이지만 모든 행동을 멈추게 할 것이고 그것은 나에게 현실적인 해결책이 아닙니다. 나는이 문제를 처리하기 위해 더 지능적인 방법이있을 것 같은 느낌하지만

나는 해결책이 있습니까 :

var stateChangeStarted = false; 
$rootScope.$on('$stateChangeStart', function(event){ 
    if(!stateChangeStarted) { 
     stateChangeStarted = true; 
     console.log('$stateChangeStart'); 
    } 
}); 

사람이 어떤 이런 일이 왜 생각 나는이를 방지하기 위해 할 수있는 다른 무엇을 가지고 있습니까?

답변

15

컨트롤러는 사용자가 연결된 상태로 들어갈 때마다 ui-router에 의해 인스턴스화됩니다. 따라서 $rootScope.$on 전화는 해당 상태에 들어갈 때마다 $stateChangeStart 이벤트에 새 수신기를 추가합니다.

컨트롤러 인스턴스 당 한 번만 이벤트를 처리해야하는 경우 $rootScope.$on이 수신 대기열에서 삭제하고 실행하는 등록 취소 기능을 저장할 수 있습니다.

var deregisterStateChangeStart = $rootScope.$on('$stateChangeStart', function (event) { 
    // Do something here. 

    deregisterStateChangeStart(); 
}); 
+0

하나의 상태 URL에서 다른 상태 URL로 이동하는 경우이 stateChangeStart는 한 번만 실행됩니다. – duyn9uyen

4

컨트롤러 시작 부분에서 stateChangeStart의 리스너를 지우십시오.

$rootScope.$$listeners.$stateChangeStart = []; 
+0

감사합니다. 나를 위해 작동합니다. – Murali

관련 문제