@ Відповідь 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
як тільки він виконає свою самогубську місію.
- Мені цікаво про те, чи буде коли-небудь примірник належним чином знищений та зібраний сміття, враховуючи, що ви посилаєтесь на закриті змінні. Вам доведеться використати мільйон таких, щоб навіть це було проблемою пам'яті, але мені цікаво. Якщо хтось має якусь інформацію, будь ласка, поділіться.