AngularJS : $ watch 지우기


277

AngularJS 응용 프로그램에 시계 기능이 있습니다.

$scope.$watch('quartzCrystal', function () {
   ...
}

그러나 어떤 조건 (예 : 단일 페이지 응용 프로그램 에서 페이지 변경) 후에 시간 초과를 지우는 것처럼 시계를 중지하고 싶습니다.

어떻게해야합니까?

답변:


520

$watch등록 해제 함수를 반환합니다. 호출하면의 등록이 취소 $watcher됩니다.

var listener = $scope.$watch("quartz", function () {});
// ...
listener(); // Would clear the watch

24
컨트롤러 수명주기가 끝날 때 (예 :와 같이 $on('$destroy')) 모든 리스너를 등록 취소하는 것이 좋은 습관 인지 또는 AngularJS가 처리 할 것인지 알고 있습니까? 감사!
yorch

81
스코프가 파괴되면 모든 감시자가 제거됩니다. 관리 할 필요가 없습니다
Umur Kontacı

6
당신은이 문제에 대해 설명 여기에 흥미로운 토론을 볼 수 있습니다 github.com/angular/angular.js/issues/4574를 당신이 $ rootScope에 리스너를 할당하면, 기본적를, 당신은 당신의 자아를 지정 해제, 또는 그것을 통해 지속됩니다 $ scope 변경. $ scope의 감시자는 $ scope로 파괴됩니다 ($ scope는 Angular의 싱글 톤이 아니며 필요할 때 만들어지고 파괴됩니다).
Mladen Danic

3
그러나 값이 존재하는지 확인한 다음 값이 존재하는 경우 일부 변경을 수행하고 자체 등록을 취소하기 위해 감시자를 원한다면 어떻게합니까? var listen = $ scope. $ watch ( 'mvIdentity.currentUser', function (currentUser) ) {test = 1; console.log ( "->"+ $ scope.updateemail + "-"+ test); listen ();});
Harshit Laddha 2016 년

4
@ UmurKontacı 실제로 deadman의 의견은 모든 경우에 원래 의견이 정확하지 않으므로 완벽하게 유효합니다.
GFoley83

49

scope. $ watch는 호출 할 수 있고 시계 등록을 취소하는 함수를 반환합니다.

다음과 같은 것 :

var unbindWatch = $scope.$watch("myvariable", function() {
    //...
});

setTimeout(function() {
    unbindWatch();
}, 1000);

14
예, watchFn 내에서 바인딩을 해제 할 수 있습니다! 간단한 사용 사례 : watchFn을 한 번만보고 실행 한 다음보고 중지합니다.
Mike Rapadas

3
언 바인드 함수를 다시 호출하는 것처럼 시계를 리 바인드 할 수 있습니까?
브루노 핑거

이것은 유용했습니다. 타임 아웃에서 unbindWatch를 수행하는 것은 테스트에서 중요해 보입니다.
eeejay

이 경우 $ timeout을 사용해야하며 등록을 취소 할 수도 있습니다!
벤 탈리아도 로스

타임 아웃을 피하는 것이 가장
좋습니다

25

문제가 발생한 직후에 취소하려면 콜백 내부의 시계를 지울 수도 있습니다. 그렇게하면 $ watch는 사용될 때까지 활성화 상태를 유지합니다.

이렇게 ...

var clearWatch = $scope.$watch('quartzCrystal', function( crystal ){
  if( isQuartz( crystal )){
    // do something special and then stop watching!
    clearWatch();
  }else{
    // maybe do something special but keep watching!
  } 
}

4

언젠가 $ watch가 호출 dynamically하고 인스턴스를 생성하므로 함수 전에 등록 취소 함수를 호출해야 $watch합니다.

if(myWatchFun)
  myWatchFun(); // it will destroy your previous $watch if any exist
myWatchFun = $scope.$watch("abc", function () {});

4

이상적으로는 스코프를 벗어날 때 모든 사용자 정의 시계를 제거해야합니다.

더 나은 메모리 관리 및 더 나은 앱 성능 향상에 도움이됩니다.

// call to $watch will return a de-register function
var listener = $scope.$watch(someVariableToWatch, function(....));

$scope.$on('$destroy', function() {
    listener(); // call the de-register function on scope destroy
});

4

감시자가 너무 많아서 모든 항목을 지워야하는 경우 배열로 밀어 넣고 모든 $watch루프를 파괴 할 수 있습니다 .

var watchers = [];
watchers.push( $scope.$watch('watch-xxx', function(newVal){
   //do something
}));    

for(var i = 0; i < watchers.length; ++i){
    if(typeof watchers[i] === 'function'){
        watchers[i]();
    }
}

watchers = [];

-10

감시자의 복사본을 폐기하려면 다음을 사용할 수 있습니다.

watchers = void 0;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.