2014-12-15 13 views
8

Przebiegłem przez bardzo "dziurę w króliczej dziurze" Pytanie kątowe dzisiaj nie mogłem znaleźć odpowiedzi. Z dokumentów $scope można zarejestrować procedurę obsługi zdarzeń pod numerem "$destroy", która jest wywoływana tuż przed zniszczeniem lunety. W ten sposób, można wyrejestrować obsługi zdarzeń tak:

var deregister = $scope.$on('myCustomEvent', function() { 
    // do some crazy stuff 
}); 
$scope.$on('$destroy', function() { 
    deregister(); 
}); 

Jednak $scope.$on('$destroy', ...) musi stworzyć swój własny program obsługi. Czy to jest automatycznie niszczone, czy też musisz wykonać następujące czynności, aby je zniszczyć?

var deregister = $scope.$on('myCustomEvent', function() { 
    // do some crazy stuff 
}); 
var deregisterDestroy = $scope.$on('$destroy', function() { 
    deregister(); 
    deregisterDestroy(); 
}); 
+0

Tak, jest zniszczony - oczywiście, jeśli odniesie się do czegokolwiek zewnętrznego, sam handler (a więc wszystko, co ma w swoim zamknięciu) nie zostanie zwolniony (tak jak wszędzie indziej). –

+0

Sądzę, że następne pytania byłyby następujące: (a) czy konieczne jest wyrejestrowanie go, i (b) jeśli tak, to czy można go wyrejestrować w sposób opisany powyżej? – jdotjdot

+0

Naa, masz po prostu nieskończoną rekursję - nie musisz się wyrejestrowywać, ponieważ zakres ulega zniszczeniu. Jestem pewien, że niedługo ktoś, kto ma więcej czasu, udzieli przyzwoitej i szczegółowej odpowiedzi :) –

Odpowiedz

1

Odpowiedź brzmi "może" w zależności od tego, co masz na myśli, gdy jest automatycznie niszczona. Jeśli przyjrzymy się źródłu metody dla zakresów $destroy, widzimy, że podczas gdy wydarzenie $destroy jest transmitowane w dół przez zakresy potomne, faktyczna metoda $destroy nigdy nie jest wywoływana na żadnym z zakresów, ale początkowy. Oznacza to, że faktyczne czyszczenie i zerowanie właściwości nigdy nie występuje w zakresach potomnych.

Powodem, że to nie jest wyciek pamięci, ponieważ po $destroy został wywołany w zakresie, zostanie on odłączony od zakresu macierzystej a zatem kwalifikuje się do zbierania śmieci, ponieważ powinny nie mają już żadnej ścieżki do Korzenie GC. Ta sama logika dotyczy wszystkich zakresów potomnych, ponieważ nie powinny one również mieć ścieżek do Korzeni GC.

Twój przykład jest jednak bezpieczny; Robię to sam w taki sam sposób, aby w razie potrzeby posprzątać własną obsługę i nie natrafić na żadne nieskończone pętle.