La respuesta de @ LiviuT es increíble, pero parece dejar a muchas personas preguntándose cómo volver a acceder a la función de desmantelamiento del controlador desde otro $ alcance o función, si desea destruirla desde un lugar distinto de donde se creó. La respuesta de @ Рустем Мусабеков funciona muy bien, pero no es muy idiomática. (Y se basa en lo que se supone que es un detalle de implementación privado, que podría cambiar en cualquier momento). Y a partir de ahí, se vuelve más complicado ...
Creo que la respuesta fácil aquí es simplemente llevar una referencia a la función de desmontaje ( offCallMeFnen su ejemplo) en el controlador mismo, y luego llamarla en función de alguna condición; quizás un argumento que incluyas en el evento que $ transmites o $ emites. De este modo, los manipuladores pueden derribarse, cuando quieran, donde quieran, llevando consigo las semillas de su propia destrucción. Al igual que:
// 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.)
Dos pensamientos:
- Esta es una gran fórmula para un controlador de ejecución única. Solo suelta los condicionales y corre
selfDestructtan pronto como haya completado su misión suicida.
- Me pregunto si el alcance original alguna vez se destruirá correctamente y se recolectará basura, dado que lleva referencias a variables cerradas. Tendría que usar un millón de estos para que incluso sea un problema de memoria, pero tengo curiosidad. Si alguien tiene alguna idea, por favor comparta.