@ LiviuT'un cevabı harika, ancak yaratıldığı yerden başka bir yerden yok etmek istiyorsanız, işleyicinin yıkılma işlevine başka bir $ kapsamından veya işlevinden nasıl yeniden erişileceğini merak eden birçok insan bırakıyor gibi görünüyor. @ Рустем Мусабеков'in yanıtı çok iyi, ama çok deyimsel değil. (Ve her zaman değişebilecek özel bir uygulama detayı olması gerekenlere dayanır.) Ve oradan, daha da karmaşıklaşıyor ...
Buradaki kolay cevabın offCallMeFn
, işleyicinin kendisinde parçalama işlevine ( örneğinde) bir referans taşımak ve daha sonra bazı koşullara göre çağırmak olduğunu düşünüyorum; belki de $ broadcast veya $ emit ettiğiniz etkinliğe dahil ettiğiniz bir argüman. Böylece işleyiciler, istedikleri zaman, istediğiniz yerde, kendi imha tohumlarını taşıyarak kendilerini parçalayabilirler. Şöyle ki:
// Creation of our handler:
var tearDownFunc = $rootScope.$on('demo-event', function(event, booleanParam) {
var selfDestruct = tearDownFunc;
if (booleanParam === false) {
console.log('This is the routine handler here. I can do your normal handling-type stuff.')
}
if (booleanParam === true) {
console.log("5... 4... 3... 2... 1...")
selfDestruct();
}
});
// These two functions are purely for demonstration
window.trigger = function(booleanArg) {
$scope.$emit('demo-event', booleanArg);
}
window.check = function() {
// shows us where Angular is stashing our handlers, while they exist
console.log($rootScope.$$listeners['demo-event'])
};
// Interactive Demo:
>> trigger(false);
// "This is the routine handler here. I can do your normal handling-type stuff."
>> check();
// [function] (So, there's a handler registered at this point.)
>> trigger(true);
// "5... 4... 3... 2... 1..."
>> check();
// [null] (No more handler.)
>> trigger(false);
// undefined (He's dead, Jim.)
İki düşünce:
- Bu, bir kez çalıştırılan işleyici için harika bir formüldür. Şartları bırakın
selfDestruct
ve intihar görevini tamamlar tamamlamaz koşun .
- Kapatılan değişkenlere referanslar taşıyorsanız, kaynak kapsamının hiç uygun şekilde yok edilip edilmeyeceğini ve çöp toplanıp toplanmayacağını merak ediyorum. Bir hafıza problemi olsa bile bunlardan bir milyonunu kullanmalısın, ama merak ediyorum. Herhangi bir görüş varsa, lütfen paylaşın.