2013-03-17 3 views
18

ng-view으로 렌더링되는 페이지에 대한 컨트롤러가 있다고 가정합니다.

이 컨트롤러는 외부 소스 (예 : 응용 프로그램 차원의 메시지 버스)의 일부 이벤트에 바인딩하여 해당 모델을 업데이트합니다. 이것은 기본적으로 매우 쉽게 작동합니다

function MyController ($scope) { 
    $scope.bar = '…'; 

    externalSource.on('foo', function (data) { 
    $scope.$apply(function() { 
     $scope.bar = data.bar; 
    }); 
    }); 
} 

문제는 : 나는이가 더 이상 표시되지 않습니다와 관련된 뷰되면 외부 소스에서 컨트롤러를 바인딩을 해제하려면 어떻게합니까?

dispose 이벤트 나 이와 유사한 것이 있습니까?

내 접근 방식이 완전히 잘못되었으므로 어떻게 든 다른 방식으로 처리해야합니까? 그렇다면 어떻게?

+0

jQuerys ** on ('event', ...) ** 메소드를 사용하는 경우 이벤트를 제거하려면 ** off ('event') **를 호출하면됩니다. 아니면 내가 잘못 했니? –

+0

특히 각도 문제는 아닙니다. 사용중인 외부 이벤트 자원에 따라 다릅니다. –

+3

예. 바인딩을 해제하는 방법을 알고 있지만 언제/어디에서해야할지 모르겠습니다. 이는 컨트롤러의 수명주기에 달려 있으며 이는 AngularJS와 관련이 있습니다. –

답변

35

이 이벤트 컨트롤러의 범위가 파괴되었다되어 사용 바인딩을 해제

Scope 더 많은 정보를위한

+2

나는 당신이'$ scope ($ destroy ', function() {...})'를 의미한다고 생각한다. –

+0

@Mark Rajcok 정말로, 고맙다. –

3

사용 $ routeChangeStart 또는 $ routeChangeSuccess 이벤트 :

function MyController ($scope) { 
    $scope.bar = '…'; 

    externalSource.on('foo', function (data) { 
    $scope.$apply(function() { 
     $scope.bar = data.bar; 
    }); 
    }); 

    $scope.$on('$routeChangeStart', function(next, current){ 
    // unregister listener 
    // externalSource.off .... 
    }); 
} 

... 또는 $destroy 이벤트 :

$scope.$on('$destroy', function() { /* Unbind code here */ }); : 실행하려면

$scope.$on('$destroy', function(){ 
    // unregister listener 
    // externalSource.off .... 
    }); 
관련 문제