2014-05-02 14 views
9

Mam kod, który używa $ scope. $ Jednorazowo na init, a następnie w funkcji, więc kod jest wykonywany wiele razy. Jak mogę się odwiązać, jeśli najpierw, zanim ponownie go zwiążę. Próbowałem $ scope. $ Off, ale nie ma takiej funkcji, docs.angularjs.org/api nie mówi nic o $ na. Używam kątowego 1.0.6.

+0

możliwy duplikat [Jak wypisać się z zdarzenie broadcast w angularjs. Jak usunąć funkcję zarejestrowaną przez $ on] (http://stackoverflow.com/questions/14898296/how-to-unsubscribe-to-a-broadcast-event-in-angularjs-how-to-remove-function-reg) – Julien

Odpowiedz

26

Jeśli nie wyrejestrujesz zdarzenia, dostaniesz wyciek pamięci, ponieważ funkcja, którą przekazujesz do $ on nie zostanie wyczyszczona (jak odniesienie do niej nadal istnieje). Co ważniejsze, wszelkie zmienne, które funkcjonują w swoim zakresie, również zostaną ujawnione. Spowoduje to, że twoja funkcja zostanie wywołana wiele razy, jeśli kontroler zostanie utworzony/zniszczony wiele razy w aplikacji. szczęście angularjs zapewnia kilka przydatnych metod, aby uniknąć wycieków pamięci i niechciane zachowanie:

  • $ na metoda zwraca funkcję, która może być wywołana do wyrejestrować słuchacza zdarzeń.
  • Za każdym razem, gdy luneta zostanie uprzątnięta w skali kątowej (to znaczy, że kontroler zostanie zniszczony) zostanie wywołane zdarzenie $ destroy w tym zakresie. Możesz zarejestrować się w zdarzeniu $ destroy $ scope i zadzwonić do niego cleanUpFunc.

zobacz dokumentację

Kod próbki:

angular.module("TestApp") 
     .controller("TestCtrl",function($scope,$rootScope){ 
     var cleanUpFunc = $scope.$on('testListener', function() { 
      //write your listener here 
     }); 

     //code for cleanup 
     $scope.$on('$destroy', function() { 
     cleanUpFunc(); 
     };  
    }) 
+0

Gdzie jest to udokumentowane? Nie mogę go znaleźć na https://docs.angularjs.org/api – jcubic

+1

http://docs.angularjs.org/api/ng.$rootScope.Scope#$on – suneetha

+0

Czy musisz wyrejestrować wydarzenie handler dla '$ destroy'? –

5

$scope.$on zwraca funkcję, do której możesz zadzwonić w celu wyrejestrowania.

+0

Czy to gdzieś jest udokumentowane? – jcubic

+1

Tak, to jest: https://docs.angularjs.org/api/ng/type/$rootScope.Scope – dude

+0

jednak nie jest to wygodne, ponieważ jeśli chcesz wyrejestrować wydarzenie w innej funkcji, musisz przekazać wyrejestrowanie funkcja poprzez różne funkcje jako parametr – dude