2010-10-18 10 views

Respuesta

2

Se utiliza en la vinculación de datos con Flex, se puede leer más sobre esto aquí

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

Creación de propiedades para su uso como la fuente para el enlace de

de datos Cuando se crea una propiedad que desea utilizar como fuente de datos expresión de enlace, Flex puede copiar automáticamente el valor de la fuente a cualquier destino propiedad cuando cambia la propiedad de origen . Para indicarle a Flex que realice la copia, debe usar la etiqueta de datos [Bindable] para registrar la propiedad con Flex.

+0

Cómo hacer el trabajo similar sin la flexión? – ollydbg

+1

@ollydbg Mencioné la respuesta a su comentario/pregunta brevemente en la parte inferior de mi respuesta a esta pregunta. En resumen, sin usar mxml puede usar el paquete ** mx.binding.utils ** para crear y modificar enlaces directamente en actionscript. –

66

[Bindable] es una una de las varias etiquetas meta que se pueden utilizar en el código ActionScript flexión. Se puede aplicar a propiedades o métodos que están marcados en cualquier ámbito. No se puede usar con miembros de clase estáticos.

La clave para usar la metaetiqueta [Bindable] es comprender lo que sucede debajo del capó cuando lo usa. Básicamente, el uso de enlace de datos es un tipo de taquigrafía para agregar oyentes de eventos y despachar eventos.

Existen dos formas básicas de la etiqueta [Bindable]. El primero es solo [Bindable] seguido de una declaración var/property. El segundo es [Bindable (event = "nombre del evento")] seguido de una declaración var/property, una declaración de función/método o la mitad de una declaración getter/setter.

Explicaré la notación más larga primero ya que la otra se basa en el mismo concepto pero con aún más taquigrafía.

Cuando se utiliza [enlazables (evento = "nombre_evento")] le está diciendo esencialmente el compilador que esta var/propiedad/función/método (llaman a esto el miembro de instancia) está 'disponible' para ser utilizado como la fuente para el enlace de datos. También le está diciendo que cuando el valor del miembro de la instancia ha sido invalidado/cambiado y necesita ser releído, se enviará el evento "eventname".
En esta forma más larga esto es todo lo que estás haciendo. Usted, el desarrollador, es responsable de enviar realmente el evento "nombre de evento" siempre que el valor deba actualizarse en los suscriptores vinculantes.

La eficacia real del uso del enlace de datos viene del lado de la suscripción. La notación típica se verá en MXML es value = "{} instance.propertyName" Cuando se utiliza la notación {} le está diciendo al compilador que hacer lo siguiente:

  1. Crear un detector de eventos que escucha el evento nombrado en la metaetiqueta enlatable
  2. En ese caso, el oyente vuelve a leer la instancia.nombrePropiedad y actualizar este valor

Si se utiliza la forma más corta [Bindable], y se agrega la etiqueta antes de una propiedad/var, el compilador llena los espacios en blanco y añade algunas funciones adicionales para hacer que el enlazable la propiedad . Básicamente le está diciendo al compilador "agregue los eventos y métodos que necesita para hacer que esta propiedad sea enlazable"
Ahora la manera de pensar qué hará el compilador bajo esta premisa es esta.

  1. hacer una versión privada de su var
  2. crear un "evento" para activar la unión
  3. crear una función getter con el alcance y el nombre de su var original que devuelve el Verson privada de la variable cuando se le llama .
  4. crea una función setter con el alcance y el nombre de tu var original que establece la versión privada de la var cuando se llama Y envía el evento desencadenante.

En esencia, el compilador hará la mayor parte del trabajo por usted.

[Bindable] 
    public var xyz 

es equivalente a

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")); 
    } 

Las únicas diferencias funcionales en estos es que en el primer ejemplo;

  1. usted no sabe el nombre del evento que será enviado a desencadenar los vinculantes
  2. no hay manera de actualizar el valor subyacente sin que facilitan que los datos de unión

Este segundo ejemplo también muestra un caso especial de la metaetiqueta [Bindable]. Esto es que cuando lo aplica a un par get/setter definido para el mismo nombre de variable, solo necesita aplicarlo a uno u otro, se aplicará a ambos. Por lo general, debe configurarlo en el getter.

Puede usar cualquier notación en una función/método; sin embargo, si no especifica un evento, nunca se activará el enlace, por lo que si está tratando de vincularse a una función, siempre debe especificar un evento. También es posible especificar más de un evento desencadenante al apilar la etiqueta. p.ej.

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

     return myMetaDataObject; 
    } 

Esto supondría que en otro lugar que la clase va a despachar este metaDataChanged evento o la metaObjectUpdated caso cuando se desea activar la unión.

También tenga en cuenta que con esta notación puede vincular la vinculación de cualquier miembro de la instancia a cualquier evento que despache la instancia. Incluso eventos heredados que usted mismo no genera como FrameEnter, OnChange, etc ...

Los enlaces de datos también se pueden configurar y destruir durante el tiempo de ejecución. Si está interesado en esto, eche un vistazo a las clases mx.binding.utils.

+0

Verifique la respuesta de Mihai [debajo] (http://stackoverflow.com/a/19729201/2530736) para enlace bidireccional – Vanlalhriata

1

Como una adición a lo que dijo Justin, en realidad puede usar el enlace de datos de dos maneras en Flex con el @ caracteres. He aquí un ejemplo:

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

Para un ejemplo de trabajo con el código fuente activado, puede comprobar fuera de este artículo que escribí hace un tiempo:

Two-ways data binding in Flex