@ LiviuT jawabannya luar biasa, tetapi sepertinya membuat banyak orang bertanya-tanya bagaimana cara mengakses kembali fungsi runtuh handler dari $ scope atau fungsi lain, jika Anda ingin menghancurkannya dari tempat lain selain dari tempat ia dibuat. @ Рустем Мусабеков Jawabannya bekerja dengan baik, tetapi tidak terlalu idiomatis. (Dan bergantung pada apa yang seharusnya menjadi detail implementasi pribadi, yang dapat berubah sewaktu-waktu.) Dan dari sana, semakin rumit ...
Saya pikir jawaban yang mudah di sini adalah dengan hanya membawa referensi ke fungsi tear-down ( offCallMeFn
dalam contohnya) di handler itu sendiri, dan kemudian menyebutnya berdasarkan beberapa kondisi; mungkin argumen yang Anda sertakan pada acara yang Anda $ broadcast atau $ emit. Dengan demikian, penangan dapat menghancurkan diri mereka sendiri, kapan pun Anda mau, di mana pun Anda inginkan, membawa benih kehancuran mereka sendiri. Seperti itu:
// 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.)
Dua pemikiran:
- Ini adalah formula yang bagus untuk penangan run-once. Jatuhkan saja persyaratan dan jalankan
selfDestruct
segera setelah ia menyelesaikan misi bunuh diri.
- Saya bertanya-tanya tentang apakah ruang lingkup asal akan pernah dihancurkan dengan benar dan dikumpulkan, mengingat Anda membawa referensi ke variabel tertutup. Anda harus menggunakan jutaan ini bahkan untuk itu menjadi masalah memori, tapi saya ingin tahu. Jika ada yang punya wawasan, silakan berbagi.