[javascript] AngularJS : $ watch 지우기

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

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

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

어떻게해야합니까?



답변

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

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


답변

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

다음과 같은 것 :

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

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


답변

문제가 발생한 직후에 취소하려면 콜백 내부의 시계를 지울 수도 있습니다. 그렇게하면 $ 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!
  }
}


답변

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

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


답변

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

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

// 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
});


답변

감시자가 너무 많아서 모든 항목을 지워야하는 경우 배열로 밀어 넣고 모든 $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 = [];


답변

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

watchers = void 0;