Tout d'abord, vous avez le même nom utilisé deux fois (clickFunc
), on ne peut déduire lequel vous vous référez dans vos appels à removeEventListener. Deuxièmement, clickFunc
ne sera accessible que dans la fonction où elle est déclarée:
function foo() {
var clickFunc: Function;
up.addEventListener(MouseEvent.CLICK,
clickFunc = function (event:MouseEvent):void
{
revealSpinner(event,51.42,1,spinner);
event.currentTarget.removeEventListener(event.type, arguments.callee);
autoTimer.stop();
},
false, 0, true);
// 'clickFunc' available here, so this is possible:
up.removeEventListener(MouseEvent.CLICK, clickFunc);
}
function bar() {
// 'clickFunc' is not available here, so this is not possible:
up.removeEventListener(MouseEvent.CLICK, clickFunc);
// 1120: Access of undefined property clickFunc
}
Si vous avez besoin de référencer les méthodes (comme, par exemple, les retirer d'un événement), ils ne peuvent pas être anonymes. Si vous avez besoin de les référencer à partir de plusieurs méthodes, elles ne doivent pas être locales à une méthode (foo dans l'exemple ci-dessus). Et ils ont besoin d'identifiants différents (clickFunc1
et clickFunc2
si vous voulez). Ceci est ma solution proposée:
private function addHandlers(): void
{
up.addEventListener(MouseEvent.CLICK, upClickHandler, false, 0, true);
down.addEventListener(MouseEvent.CLICK, downClickHandler, false, 0, true);
}
private function removeHandlers(): void
{
up.removeEventListener(MouseEvent.CLICK, upClickHandler);
down.removeEventListener(MouseEvent.CLICK, downClickHandler);
}
private function upClickHandler(event:MouseEvent):void
{
revealSpinner(event,51.42,1,spinner);
event.currentTarget.removeEventListener(event.type, arguments.callee);
autoTimer.stop();
}
private function downClickHandler(event:MouseEvent):void
{
revealSpinner(event,51.42,-1,spinner);
event.currentTarget.removeEventListener(event.type, arguments.callee);
autoTimer.stop();
}
Bien sûr, si, comme dans votre exemple, les méthodes sont identiques, vous pouvez utiliser une seule:
private function addHandlers(): void
{
up.addEventListener(MouseEvent.CLICK, clickHandler, false, 0, true);
down.addEventListener(MouseEvent.CLICK, clickHandler, false, 0, true);
}
private function removeHandlers(): void
{
up.removeEventListener(MouseEvent.CLICK, clickHandler);
down.removeEventListener(MouseEvent.CLICK, clickHandler);
}
private function clickHandler(event:MouseEvent):void
{
revealSpinner(event,51.42,-1,spinner);
event.currentTarget.removeEventListener(event.type, arguments.callee);
autoTimer.stop();
}
Je l'ai déjà essayé et produit une erreur "1120: Accès de la propriété indéfinie clickFunc" sur lui-même – ed209