Comment puis-je envoyer un événement personnalisé à partir d'une classe actionscript 3 et de les écouter dans la racine du document?
J'ai construit un événement personnalisé répartiteur qui transmet des variables. Je distribue l'événement et puis j'ai essayer d'écouter l'événement dans ma racine du document, mais je n'ai jamais reçu l'événement. Comment puis-je bulle de l'événement jusqu'à ma classe de document?
addEventListener(CustomVarEvent.pinClicked, pinClickedHandler);
function pinClickedHandler(e:CustomVarEvent) {
trace("main says " + e.arg[0] + " clicked");//access arguments array
}
package zoomify.viewer
{
import com.maps.CustomVarEvent;
protected function hotspotClickHandler(event:MouseEvent):void {
var hotspotData:Hotspot = hotspotsMap[event.currentTarget] as Hotspot;
trace(hotspotData._name + " was clicked");
/*if(hotspotData) {
navigateToURL(new URLRequest(hotspotData.url), hotspotData.urlTarget);
}*/
dispatchEvent(new CustomVarEvent("pinClicked",true,false,hotspotData._name));
}
}
package com.maps
{
//Import class
import flash.events.Event;
//CustomVarEvent
public class CustomVarEvent extends Event {
public static const pinClicked:String = "pinClicked";
//Properties
public var arg:*;
//Constructor
public function CustomVarEvent(type:String, ... a:*) {
var bubbles:Boolean = true;
var cancelable:Boolean = false;
super(type, bubbles, cancelable);
arg = a;
}
//Override clone
override public function clone():Event{
return new CustomVarEvent(type, arg);
};
}
}
La pinClicked événement qui est en train d'être distribué est imbriqué deux niveaux de profondeur dans les classes. - Je ajouter une instance de la classe ZoomifyViewer à la scène. ZoomifyViewer ajoute et de l'instance de ZoomGrid à la scène et ZoomGrid distribue l'événement.
Lorsque j'ajoute le même écouteur d'événement et de la fonction de gestionnaire directement dans mon ZoomGrid de classe (de la même classe que l'événement est distribué à partir d'), puis de l'auditeur et de gestionnaire de fonctionner correctement. Toutefois, lorsque l'auditeur et le gestionnaire sont dans une classe parente, ou sur la scène, je ne reçois aucune réponse.
Est un répartiteur nécessaires à la bulle à bulle?
Aussi, ce sont ces deux lignes identiques en fonction de la constante pinClicked qui est définie dans mon CustomVarEvent?
dispatchEvent(new CustomVarEvent(CustomVarEvent.pinClicked, hotspotData._name));
dispatchEvent(new CustomVarEvent("pinClicked", hotspotData._name));
OriginalL'auteur Bryan | 2009-04-14
Vous devez vous connecter pour publier un commentaire.
L'événement ne peut remonter dans la liste d'affichage si objet qui a distribué l'événement est un objet d'affichage (ou un ancêtre de la classe DisplayObject, comme un Sprite ou MovieClip), de sorte qu'il peut être dans la liste d'affichage ET il est ajouté à la liste d'affichage à l'heure de l'événement de l'expédition.
Le code que vous avez écrit n'est pas la ligne qui distribue un événement dans le cadre d'une classe à tous, juste une fonction dans un paquet, donc je ne suis pas sûr de l'endroit où vous avez l'intention sur elle bouillonne.
Une solution rapide pour vous serait tout simplement d'avoir le même objet que l'utilisateur a cliqué ont de l'événement distribué hors de lui, parce que depuis qu'il a été cliqué, c'est évidemment un objet d'affichage qui est sur scène, qui répond à nos deux conditions pour que la garniture bouillonne.
de l'événement.currentTarget est quel que soit l'objet a été à l'écoute de la MouseEvent, de l'événement.la cible est un objet distribué le MouseEvent. De toute façon, dans ce cas, il est probablement votre point d'accès. Mais depuis l'événement.la cible a été ce qui a été cliqué, je sais à 100% que c'est un objet d'affichage sur scène, j'ai donc choisi 🙂
Merci Bryan. Parce que cette réponse est donc claire, j'ai vérifié certains des autres réponses sur votre profil. Je suis en train d'apprendre beaucoup de vous.
OriginalL'auteur Bryan Grezeszak
Événements remontent dans la liste d'affichage. Je ne peux pas dire à partir de votre code d'exemple de ce que l'objet que vous êtes à l'envoi de l'événement, seulement que vous avez une méthode d'une classe de le faire. A une instance de cette classe d'été ajouté à la liste d'affichage?
OriginalL'auteur Stiggler
Bouillonnant ne fonctionne que lorsque l'objet qui distribue l'événement est sur la displaylist. Qui est tous les petits-enfants de la scène.
Qui est bien votre problème, mais je ne vois pas à partir de l'extrait de code si vous ajoutez le dispatching de la classe à la displaylist.
Aussi, il ne regarde pas comme vous avez fait une coutume EventDispatcher, mais un Événement personnalisé. Mais j'ai peut-être tort (ne peut pas voir l'ensemble de votre code).
OriginalL'auteur Jacob Poul Richardt
Pour écouter votre événement personnalisé, vous devriez avoir une référence valide pour les dispatcher dans votre classe de document.
yourDispatcher.la méthode addEventListener(CustomVarEvent.pinClicked, pinClickedHandler);
Où yourDispatcher est la classe d'envoi de l'événement personnalisé.
Oui, il est. En fait, c'est très facile. Je l'utilise tout le temps. C'est l'un des plus grands avantages de l'héritage, vous pouvez ajouter des fonctionnalités sans rien perdre.
J'ai appris quelque chose...: )
honte sur moi !!! :' |
OriginalL'auteur OXMO456