Question

J'ai une classe CircleButton dans Actionscript. Je veux savoir quand quelqu'un de l'extérieur a changé la propriété 'on'. J'essaie d'écouter 'onChange' mais cela ne frappe jamais ce gestionnaire d'événements.

Je sais que je peux écrire la propriété 'on' comme get / setter mais j'aime bien la simplicité d'utiliser simplement [Bindable]

Un objet ne peut-il pas écouter ses propres événements?

public class CircleButton extends UIComponent

{
    [Bindable]
    public var on:Boolean;

    public function CircleButton()
    {
        this.width = 20;
        this.height = 20;

        graphics.beginFill(0xff6600, 1);
        graphics.drawCircle(width/2, height/2, width/2);
        graphics.endFill();

        this.addEventListener(MouseEvent.ROLL_OVER, rollover);  
        this.addEventListener(MouseEvent.ROLL_OUT, rollout);        

        this.addEventListener('onChange', onOnChange);
    }       

    private function onOnChange(event:PropertyChangeEvent):void {
Était-ce utile?

La solution

Si vous utilisez la balise [Bindable] sans spécifier de type d'événement, lorsque la propriété change de valeur, un événement de type: PropertyChangeEvent.PROPERTY_CHANGE, qui correspond à la chaîne "propertyChange", sera distribué.

Par conséquent, pour pouvoir vous inscrire afin d'écouter cet événement, vous devez dire:

this.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onOnChange);

La raison pour laquelle votre fonction d'écoute n'a jamais été appelée est que le type d'événement n'était pas correct.

Notez que la méthode d'écoute sera appelée lorsque l'une des variables marquées comme étant Bindable dans votre classe changera, pas seulement "on". Cet événement est livré avec une propriété appelée 'propriété' qui indique quelle variable a été modifiée.

Pour éviter d'être appelé sur chaque variable Bindable, vous devez spécifier un événement dans la balise [Bindable]:

[Bindable(event="myOnChangeEvent")]

et envoyez cet événement manuellement lorsque vous considérez que la propriété est en train de changer (c'est-à-dire: dans le séparateur), bien que cela ne semble pas être ce que vous souhaitiez faire.

Autres conseils

Vous pouvez utiliser BindingUtils.bindSetter ()

Un exemple est trouvé ici .

Ce n’est pas parce qu’il est possible que quelque chose soit lié à la variable que quelque chose est lié à la variable. C'est un peu comme le système d'événements - ce n'est pas parce que quelque chose peut envoyer un événement que rien n'écoute.

Les classes autour desquelles la liaison Flex est basée sont BindingUtils et ChangeWatcher. Lorsque vous liez directement en MXML (qui vient d'être converti en AS3 par le compilateur), il utilise ces classes en arrière-plan pour établir la liaison. J'ai déjà exploré ChangeWatcher et, lorsqu'il examine la liste des éléments potentiellement liés, il ne le distribue que si un objet est réellement répertorié en tant qu'écouteur. Le système de liaison dans son ensemble est en fait un wrapper intelligent autour du système d’événements.

La sémantique de la liaison dans AS3 au lieu de MXML est différente. Les différences subtiles (comme l'enchaînement aux propriétés enfant d'objets) qui fonctionnent uniquement en MXML nécessitent un travail en AS3 pour dupliquer le comportement (probablement du fait de la génération de code entre MXML et AS3).

Jetez un coup d'oeil à ceci Adobe doc pour un peu d’informations sur ChangeWatcher en code AS.

Personnellement, je n'utilise pas la reliure en dehors de MXML, car j'estime qu'elle est maladroite. Je vous suggèrerais plutôt d’écrire une fonction de définition car elle est plus prévisible (et très probablement performante). Je vous suggère également de lire le code source de ChangeWatcher et BindingUtils. C’est certainement l’une des AS3 les plus avancées que vous êtes susceptible de lire.

Une de mes approches préférées est la classe Observe, qui se trouve ici. . Il utilise essentiellement un passeur, mais c’est une bonne approche répétable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top