2014-12-15 19 views
8

Hemen hemen "tavşan-delikli" açısal bir soruya rastladım cevabı bulamadım. $scope belgelerinden, bir kapsamın imha edilmesinden hemen önce çağrılan "$destroy"'da bir olay işleyicisini kaydedebilirsiniz. Bu şekilde, şöyle olay işleyicileri sildirebilirsin:

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

Ancak $scope.$on('$destroy', ...) kendi işleyicisi oluşturmanız gerekir. Bu otomatik olarak yok edildi mi yoksa yok etmek için aşağıdaki gibi bir şey yapmak zorunda mı?

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

Evet, imha edilir - elbette işleyicinin dışına herhangi bir şey atıfta bulunursa (ve böylece kapandığında sahip olduğu her şey) tabiki tahsis edilmeyecektir (her yerde olduğu gibi). –

+0

Takip eden sorular şu şekilde olurdu: (a) bunu kayıt altına almak zorunludur ve (b) eğer öyleyse, yukarıda yazdığım şekilde kayıt dışı bırakabilir misiniz? – jdotjdot

+0

Naa, sadece sonsuz özyineniz var - kapsamı yok edersiniz. Eminim çok yakında birileri daha iyi ve detaylı bir cevap verecektir :) –

cevap

1

Yanıt, otomatik olarak yok edilmesinden ne kastettiğinize bağlı olarak aslında "belki" dir. Kapsamlar için $destroy yönteminin kaynağına bakarsak, bir $destroy olayının, alt kapsamlar boyunca aşağı doğru yayınlanırken, gerçek $destroy yönteminin hiçbir şekilde hiçbir şekilde ancak ilk sürümde çağrılmadığını görebiliriz. Bu, gerçek temizleme ve mülk dışı bırakmanın asla çocuk kapsamlarında gerçekleşmediği anlamına gelir.

kez $destroy bir kapsamına çağrılan edildiği için bunun ana kapsamı çıkmışsa ve artık herhangi bir yol olmalı çünkü çöp toplama için bu nedenle uygundur bu bellek akmaması nedeni GC Kökleri. Aynı mantık tüm çocuk kapsamları için de geçerlidir çünkü GC Kökleri için de bir yolu olmamalıdır.

Örneğiniz güvende; Gerektiğinde kendi işleyicileri temizlemek için kendimi aynı şekilde yapıyorum ve sonsuz döngülere rastlamadım.

İlgili konular