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ć?

Odpowiedzi:


520

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

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

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

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!
  } 
}

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 () {});

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

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 = [];

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.