Que signifie [Bindable] dans actionscript?

[Bindable]
/**
* Display output of video device.
*/              
public var videoLocal : Video;

Quelqu'un le sait?

23
demandé sur ollydbg 2010-10-18 17:18:23

3 réponses

[Bindable] est une des balises meta que vous pouvez utiliser dans le code ActionScript flex. Il peut être appliqué à des propriétés ou des méthodes qui sont marqués dans toute la portée. Il ne peut pas être utilisé avec les membres statiques de la classe.

la clé pour utiliser le [Bindable] la balise meta est de comprendre ce qui se passe sous le capot lorsque vous l'utilisez. Essentiellement utiliser la liaison de données est un type de raccourci pour ajouter des écouteurs d'événements et de dispatching événement.

il y a deux formes de base du [Bindable] balise. La première est juste [Bindable] suivi d'une déclaration var/propriété. La Deuxième est [Bindable (event= "eventname")] suivie soit d'une déclaration var/propriété, soit d'une déclaration fonction/méthode, soit d'une demi-déclaration getter/setter.

je vais expliquer la notation plus long d'abord puisque l'autre construit sur le même concept, mais avec encore plus abréviation.

quand vous utilisez [Bindable (event= "eventname")] vous dites essentiellement au compilateur que cette var/propriété/fonction/méthode (appelez cela le membre d'instance) est 'disponible' pour être utilisée comme source pour la liaison de données. Vous lui dites aussi que lorsque la valeur du membre de l'instance a été invalidée/changée et qu'il doit être relu que l'événement "eventname" sera envoyé.

Dans cette forme plus longue ceci tout ce que vous faites. Vous l' les développeurs sont responsables de l'envoi effectif de l'événement" eventname " chaque fois que la valeur doit être mise à jour dans les abonnés liant.

l'efficacité réelle de l'utilisation de data binding vient du côté des abonnés. La notation typique que vous verrez dans MXML est valeur="{instance.propertyName}" quand vous utilisez la notation { } vous dites au compilateur d'effectuer les opérations suivantes:

  1. créer un écouteur d'événements qui écoute l'événement nommé dans le bindable de la balise meta
  2. dans ce cas, l'auditeur relira l'instance.propertyName et mettre à jour cette valeur

si vous utilisez la forme plus courte [Bindable], et vous ajoutez la balise avant d'une propriété/var, le compilateur remplit les blancs et ajoute quelques fonctionnalités supplémentaires pour rendre la propriété peut être liée. Essentiellement, vous dites au compilateur "ajouter les événements et les méthodes dont vous avez besoin pour faire cette propriété bindable"

Maintenant, la façon de penser de ce que le compilateur fera sous le capot, c'est ça.

  1. faites une version privée de votre var
  2. créer un "événement" pour déclencher la liaison
  3. créez une fonction getter avec la portée et le nom de votre var original qui renvoie le verson privé du var lorsqu'il est appelé.
  4. créer une fonction de setter avec la portée et le nom de votre var original qui définit la version privée du var lorsqu'il est appelé et envoie l'événement déclencheur.

dans l'essence le compilateur fera beaucoup de travail pour vous.

    [Bindable]
    public var xyz

est équivalent à

    private var _xyz:String;

    [Bindable(event="updateXYZValue")]
    public function get xyz():String{
        return _xyz;
    }

    public function set xyz(newxyz:String):void{
        _xyz = newxyz;
        dispatchEvent(new Event("updateXYZValue"));
    }

les seules différences fonctionnelles dans ces derniers est que dans le premier cas;

  1. vous ne connaissez pas le nom de l'événement qui sera distribué à déclencher la liaison
  2. il n'y a aucun moyen de mettre à jour la valeur sous-jacente sans déclenchant le la liaison de données

ce second exemple montre aussi un cas particulier de [Bindable] la balise meta. C'est que lorsque vous l'appliquez à une paire getter/setter définie pour le même nom de variable, vous n'avez besoin de l'appliquer qu'à l'un ou l'autre, il s'appliquera aux deux. Typiquement, vous devriez le mettre sur le getter.

Vous pouvez utiliser la notation sur une fonction/méthode, cependant, si vous ne spécifiez pas un événement la liaison ne sera jamais déclenché donc, si vous tentent de se lier à une fonction, vous devez toujours spécifier un événement. Il est également possible de spécifier plus d'un événement déclencheur en cumulant la balise. par exemple.

    [Bindable(event="metaDataChanged")]
    [Bindable(event="metaObjectUpdated")]
    public function readMyMetaData():MetaDataObject{
        var myMetaDataObject:MetaDataObject;
            .
            .
            .

        return myMetaDataObject;
    }

ceci supposerait que quelque part ailleurs vous votre classe vous allez envoyer ceci metaDataChanged l'événement ou le metaObjectUpdated événement lorsque vous souhaitez déclencher la liaison.

notez aussi qu'avec cette notation vous pouvez lier la liaison de n'importe quel membre d'instance à n'importe quel événement l'instance de l'expédition. Même les événements hérités que vous ne générez pas vous-même tels que FrameEnter, OnChange, etc...

les liaisons de données peuvent aussi être configurées et détruites pendant l'exécution. Si cela vous intéresse, jetez un coup d'oeil au mx.contraignant.utils classes.

67
répondu Justin Ohms 2014-11-10 19:45:35

Il est utilisé dans la liaison de données avec Flex, vous pouvez en lire plus à ce sujet ici

http://livedocs.adobe.com/flex/3/html/help.html?content=databinding_2.html

Création de propriétés à utiliser comme source pour la liaison de données

Lorsque vous créez une propriété que vous souhaitez utiliser comme source de données expression de liaison, Flex can copier automatiquement la valeur de la la propriété de la source à n'importe quelle destination propriété lorsque le propriété de la source changement. Pour signaler à Flex de jouer la copie, vous devez utiliser le [Bindable] étiquette de données pour enregistrer la propriété avec Flex.

3
répondu Mads Lee Jensen 2010-10-18 13:25:06

en plus de ce que Justin a dit, Vous pouvez en fait utiliser deux façons de lier des données dans Flex avec le @ personnage. Voici un exemple:

<s:TextInput id="txt1" text="@{txt2.text}" />

pour un exemple de travail avec le code source activé, vous pouvez consulter cet article que j'ai écrit il y a quelques temps:

Deux moyens de liaison de données dans Flex

1
répondu Mihai Popa 2013-11-01 14:52:09