AngularJS: Wyczyść $ zegarek

277

Mam funkcję oglądania w mojej aplikacji AngularJS.

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

Jednak po pewnym warunku (w moim przykładzie zmianie strony w mojej aplikacji jednostronicowej ) chcę zatrzymać ten zegarek (jak na przykład usunięcie limitu czasu).

Jak mogę to zrobić?

kamaci
źródło

Odpowiedzi:

520

$watchzwraca funkcję wyrejestrowania. Nazwanie go wyrejestruje $watcher.

var listener = $scope.$watch("quartz", function () {});
// ...
listener(); // Would clear the watch
Umur Kontacı
źródło
24
Czy wiesz, czy dobrą praktyką jest wyrejestrowanie wszystkich słuchaczy pod koniec cyklu życia kontrolera (jak na a $on('$destroy')), czy AngularJS zajmie się nimi? dzięki!
rok
81
Wszyscy obserwatorzy zostaną usunięci po zniszczeniu lunety, nie musisz nimi zarządzać
Umur Kontacı
6
Tutaj możesz zobaczyć interesującą dyskusję, która wyjaśnia tę sprawę: github.com/angular/angular.js/issues/4574 Zasadniczo, jeśli przypisujesz słuchacza do $ rootScope, musisz cofnąć przypisanie go do siebie, inaczej będzie trwało przez Zmiany zakresu $. Obserwatorzy na $ scope są niszczeni za pomocą $ scope (lunety $ nie są singletonami w Angularu i są tworzone i niszczone w razie potrzeby).
Mladen Danic
3
Ale co jeśli chcę tylko obserwatora do sprawdzania, czy wartość istnieje, a następnie, gdy istnieje, dokonaj pewnych zmian, a następnie wyrejestruj się, już próbowałem - var listen = $ scope. $ Watch ('mvIdentity.currentUser', funkcja (currentUser ) {test = 1; console.log ("->" + $ scope.updateemail + "-" + test); listen ();});
Harshit Laddha
4
@ UmurKontacı W rzeczywistości komentarz Deadman jest całkowicie poprawny, ponieważ oryginalny komentarz nie jest poprawny dla każdego przypadku.
GFoley83,
49

scope. $ watch zwraca funkcję, którą możesz wywołać i która wyrejestruje zegarek.

Coś jak:

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

setTimeout(function() {
    unbindWatch();
}, 1000);
Anders Ekdahl
źródło
14
Tak, możesz cofnąć powiązanie w ramach watchFn! Prosty przypadek użycia: chcesz obejrzeć i uruchomić zegarek tylko raz, a następnie przestać oglądać.
Mike Rapadas
3
Czy mogę ponownie powiązać zegarek po wywołaniu funkcji unbind, tak jak w przypadku ponownego wywołania?
Bruno Finger,
To było przydatne. Wykonanie rozłączenia po przekroczeniu limitu czasu wydaje się ważne w moich testach.
eeejay,
W takim przypadku należy użyć limitu czasu $, który można również wyrejestrować!
Ben Taliadoros
Najlepiej unikać limitów czasu
Davi Lima,
25

Możesz również wyczyścić zegarek wewnątrz oddzwaniania, jeśli chcesz go wyczyścić zaraz po tym, jak coś się stanie. W ten sposób Twój zegarek $ pozostanie aktywny do momentu użycia.

Tak jak ...

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!
  } 
}
SoEzPz
źródło
4

Kiedyś Twój $ watch dzwoni dynamicallyi utworzy swoje instancje, więc musisz wywołać funkcję wyrejestrowania przed swoją $watchfunkcją

if(myWatchFun)
  myWatchFun(); // it will destroy your previous $watch if any exist
myWatchFun = $scope.$watch("abc", function () {});
naCheex
źródło
4

Idealnie byłoby, gdyby każdy niestandardowy zegarek został usunięty po opuszczeniu lunety.

Pomaga w lepszym zarządzaniu pamięcią i lepszej wydajności aplikacji.

// 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
});
Manish Kumar
źródło
4

Jeśli masz za dużo obserwatorów i musisz wyczyścić wszystkich, możesz wepchnąć ich do tablicy i zniszczyć wszystko $watchw pętli.

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 = [];
Rewar
źródło
-10

Aby odrzucić kopię obserwatora, możesz użyć tego:

watchers = void 0;
shailendra pathak
źródło