Est-il un moyen de supprimer inconnu des écouteurs d'événement à partir d'objets?
Je veux avoir une réutilisables bouton qui peut être inscrit à l'un des nombreux différents rappels, déterminé par une source externe. Lorsqu'une nouvelle fonction de rappel est définie, je veux supprimer l'ancienne. Je veux aussi être en mesure d'effacer le rappel de l'extérieur à tout moment.
public function registerButtonCallback(function:Function):void
{
clearButtonCallback();
button.addEventListener(MouseEvent.CLICK, function, false, 0, true);
}
public function clearButtonCallback():void
{
if (button.hasEventListener(MouseEvent.CLICK) == true)
{
//do something to remove that listener
}
}
J'ai vu des suggestions sur ici pour utiliser les "arguments.le destinataire de l'appel" dans le rappel, mais je ne veux pas avoir cette fonctionnalité liée à la fonction de rappel - par exemple, je pourrais voulez être en mesure de cliquer sur le bouton deux fois.
Suggestions?
Vous devez vous connecter pour publier un commentaire.
Je suis en supposant que vous souhaitez uniquement une fonction de rappel à un moment donné. Si c'est le cas, alors pourquoi ne pas avoir une seule fonction de rappel associé à l'événement click sur le bouton qui lui-même appelle une fonction et que la fonction d'être réglable...
Un consommateur de votre contrôle qui abrite votre bouton définir le onClickFunction avec la fonction appropriée. En fait, vous pouvez l'installer aussi souvent que vous avez aimé.
Si vous voulez aller plus loin, vous pourriez créer des sous-classes AS3 Touche de classe et envelopper tout cela à l'intérieur.
Pas. Vous avez besoin pour maintenir une référence à l'auditeur pour l'enlever. À moins que vous stocker une référence à la fonction d'écoute à l'avance, il n'est pas publique documenté méthode pour récupérer une telle référence d'un EventDispatcher.
Comme vous pouvez le voir, il existe deux méthodes pour vous dire si un type d'événement a un écouteur ou un de ses parents a un écouteur, mais aucune de ces méthodes retournent, en réalité, une liste d'auditeurs.
Maintenant s'il vous plaît aller harceler Adobe pour la rédaction d'un tel inutile de l'API. Fondamentalement, ils vous donnent la possibilité de savoir "si", le flux d'événements a changé, mais ils vous donnent pas moyen de faire quelque chose avec cette information!
Magasin de l'auditeur comme un accessoire. Quand un autre événement est ajouté, vérifiez pour voir si l'auditeur, et si c'est le cas, appelez removeEventListener.
Sinon, remplacer la méthode addEventListener de vous bouton. Lorsque la méthode addEventListener est appelé, magasin de la fermeture avant de l'ajouter à l'événement dans un objet Dictionary. Lorsque la méthode addEventListener est appelée de nouveau, supprimer:
J'ai écrit une sous-classe appelée EventCurb à cet effet, voir mon blog ici ou collez ci-dessous.
Quelque chose que j'aime faire est d'utiliser une dynamique Globale de la classe et d'ajouter une référence rapide à la fonction d'écoute en ligne. C'est en supposant que vous aimez avoir la fonction d'écoute à la méthode addEventListener comme je le fais. De cette façon, vous pouvez utiliser removeEventListener à l'intérieur de la méthode addEventListener 🙂
Essayez ceci:
}
//looky ici! C'est l'important
dynamique de classe Mondiale {}
Le secret, c'est la dynamique de classe Mondiale. Avec cela, vous pouvez ajouter dynamiquement des propriétés lors de l'exécution.
La suite de ne pas aborder la question fondamentale de la suppression d'événement inconnu des auditeurs, mais si ce que vous avez besoin est de désactiver tous les événements liés à la souris, y compris les inconnus, il suffit d'utiliser:
mouseEnabled=false sur votre cible de l'événement.
Plus de bonnes choses ici:
http://www.thoughtprocessinteractive.com/blog/the-power-and-genius-of-mousechildren-and-mouseenabled
K2xL Classe EventManager
http://k2xl.com/wordpress/2008/07/02/as3-eventmanager-class-removealllisteners/