2008-10-16 9 views
2

J'ai une classe CircleButton dans Actionscript. Je veux savoir quand quelqu'un à l'extérieur a changé la propriété 'on'. J'essaie d'écouter 'onChange' mais il n'atteint jamais ce gestionnaire d'événement.Un composant Actionscript peut-il écouter ses propres événements propertyChange?

Je sais que je peux écrire le « sur » la propriété comme getter/setter mais j'aime la simplicité tout en utilisant [Bindable]

un objet peut ne 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 { 

Répondre

7

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 enregistrer pour écouter cet événement, vous devez dire:

this.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onOnChange); 

La raison pour laquelle la fonction d'écouteur n'a jamais été appelé est que le type d'événement n'a pas été correct.

Notez que la méthode d'écouteur sera appelée lorsque l'une des variables marquées comme Bindable dans votre classe change, non 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é à chaque variable Bindable, vous devez spécifier un événement dans la balise [Bindable]:

[Bindable(event="myOnChangeEvent")] 

et envoyer cet événement manuellement lorsque l'on considère que la propriété change (ex: en le passeur), bien que cela ne semble pas être ce que vous vouliez faire.

+0

Vous n'avez pas besoin de la référence 'this' avant les appels de méthode. –

+2

Vous n'avez pas, mais il a été ajouté pour plus de clarté sur qui vous ajoutez l'auditeur. – Laura

1

Vous pouvez utiliser BindingUtils.bindSetter()

Un exemple se trouve here.

1

Tout simplement parce qu'il est possible que quelque chose se lie à la variable, cela ne signifie pas que quelque chose est lié à la variable. C'est un peu comme le système d'événements - juste parce que quelque chose peut envoyer un événement ne signifie pas que quelque chose écoute.

Les classes autour desquelles la liaison Flex est basée sont BindingUtils et ChangeWatcher. Lorsque vous liez directement dans MXML (qui vient d'être converti en AS3 par le compilateur), il utilise ces classes derrière la scène pour réellement établir la liaison. J'ai déjà travaillé dans ChangeWatcher avant et quand il regarde la liste des éléments potentiellement liables, il distribue seulement si un objet est listé comme écouteur. L'ensemble du système de liaison est un wrapper intelligent autour du système d'événements en fait.

La sémantique de la liaison dans AS3 au lieu de MXML est différente. Des différences subtiles (comme le chaînage des propriétés enfant des objets) qui fonctionnent uniquement dans MXML nécessitent un travail dans AS3 pour dupliquer le comportement (probablement le résultat de la génération de code entre MXML et AS3).

Jetez un oeil à ce Adobe doc pour un peu d'informations sur ChangeWatcher dans le code AS.

Personnellement, je n'utilise pas de liaison en dehors de MXML car je la sens maladroite. Je vous suggère d'écrire une fonction setter à la place car elle est plus prévisible (et très performante). Je vous suggère également de lire le code source de ChangeWatcher et BindingUtils. C'est certainement l'un des AS3 les plus avancés que vous êtes susceptible de lire.

1

Une de mes approches préférées est la classe Observe qui se trouve here. Il utilise essentiellement un setter mais c'est une bonne approche reproductible.

Questions connexes