Ответ @ LiviuT потрясающий, но, похоже, многие люди задаются вопросом, как повторно получить доступ к функции разрыва обработчика из другой области действия или функции $, если вы хотите уничтожить ее из места, отличного от того, где оно было создано. Ответ @ Рустем Мусабеков работает просто замечательно, но не очень идиоматично. (И полагается на то, что должно быть частной реализацией, которая может измениться в любое время.) И с этого момента, это становится все более сложным ...
Я думаю, что простой ответ здесь - просто передать ссылку на функцию разрыва ( offCallMeFn
в его примере) в самом обработчике, а затем вызвать ее на основании некоторого условия; возможно, аргумент, который вы включаете в событие, которое вы $ широковещательно или $ излучаете. Таким образом, обработчики могут сносить себя, когда вы хотите, где угодно, неся семена своего собственного уничтожения. Вот так:
// 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.)
Две мысли:
- Это отличная формула для однократного запуска обработчика. Просто бросьте условия и бегите,
selfDestruct
как только он завершит свою миссию самоубийства.
- Интересно, будет ли когда-либо исходная область действия должным образом уничтожена и собрана мусором, учитывая, что вы несете ссылки на закрытые переменные. Вы должны использовать миллион из них, чтобы даже иметь проблемы с памятью, но мне любопытно. Если у кого-то есть понимание, пожалуйста, поделитесь.