Flex 4
Binding Expressions
• Una expresión enlazable permite mover datos
de un objeto a otro en tiempo de ejecución sin necesidad de gestionar complejos eventos o escribir partes de código AS.
• Representan sólo una posibilidad para
• <s:TextInput id=“origen” text=”cualquier
dato”/>
• <s:Label id=”destino”/>
• El valor de la propiedad texto del primer
• Flex nos ofrece tres tipos de sintaxis para
binding
– envolver la expresión enlazada en un atributo de
una declaración MXML
– usando la etiqueta<fx:Binding>
Binding 1
• Asignamos un id único al control origen
• En el control destino, usamos una expresión As que
hace referencia a la propiedad text del control origen con {}
– <s:TextInput id=”origen” text=”cualquier valor”/> – <s:Label text=”{origen.text}”/>
• En tiempo de ejecución, si la propiedad text del control
enlazar dos componentes entre ellos
• En Flex 3:
– <s:TextInput id=”input1” text=”{input2.text}”/> – <s:TextInput id=”input2” text=”{input1.text}”/>
• En Flex 4
Binding 2 – fx:Binging
• En la etiqueta fx:Binding utilizamos sus
propiedades source y destination
– <fx:Binding source=”sourceText.text”
destination=”destinationText.text”/>
• Esta etiqueta se puede usar cuando el objeto
Ejemplo
• <fx:Script> • <![CDATA[ • [Bindable]
• private var myVar:String • ]]>
• </fx:Script>
• <fx:Binding source=”myInput.text” destination=”myVar”/> • <s:TextInput id=”myInput”/>
Crear expresiones bindable
• La mayoría de propiedades de los objetos en la biblioteca de Flex son bindable
– significa que si el valor de la propiedad cambia en
tiempo real, el nuevo valor es lanzado para actualizar el objeto de destino
• Si declaramos variables en AS, sus valores NO son bindables por defecto.
– Debemos marcarlos como tal con la etiqueta
Error
• <fx:Script> • <![CDATA[
• private var myVar:String=”hola”;
• ]]>
• </fx:Script>
• <s:Label id=”destinationLabel”
Explicación
• la variable myVar comparte su valor con el
control destinationLabel cuando la aplicación arranca, pero puesto que la variable no se ha marcado como bindable, cualquier cambio en tiempo real no será pasado al control.
• El compilar nos avisa de este problema y
Solución
• <fx:Script> • <![CDATA[
• [Bindable]
• private var myVar:String=”hola”;
• ]]>
• </fx:Script>
• <s:Label id=”destinationLabel”
• la etiqueta de metadato [Bindable] debe
colocarse justo antes de la variable que modifica.
• Tb se puede poner todo en una misma línea
Arquitectura Model – View - Controller
• Una aplicación Flex puede tener muchas “vistas”
– pantallas o representaciones visuales de datos que ejecutan
funciones, recogen datos, o presenta la info del usuario.
– Si intentamos implementar todas esas vistas en un único fichero
source, el resultado no es muy bueno.
• Igual, la aplicación puede necesitar hacer llamadas a
servidores remotos para conseguir datos, implementar
estructuras de objetos que gestionan esos datos en tiempo real.
• En la clásica arquitectura MVC, las partes de la aplicación que
hacen esas llamadas, y las clases que contienen o representan
• Controller es responsible de recibir y interpretar las
entradas de usuario.
• En Flex, el controler es implementado como un
mapping de los eventos de la aplicación.
• Podemos crear componentes view con MXML o As
pero la mayoría de componentes MXML cumplen eficazmente esta función.
• Vamos ver cómo crear Vistas para la aplicación con
Crear un nuevo componente MXML
• Se recomienda crear subcarpetas dentro del paquete root y
nombrarlos en minus
– boton derecho en carpeta src del proyecto – New – folder
– la llamamos components
– boton derecho en la nueva carpeta
– new – mxml component • Nombre : Componente1 • Layout en VerticalLayout
• Based of Panel
• Finish
Componente1
<?xml version="1.0" encoding="utf-8"?>
<s:Panel xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300"> <s:layout>
<s:VerticalLayout/> </s:layout>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here --> </fx:Declarations>
• Podemos borrar el elemento fx:Declarations y
poner un título en vista Design al nuevo Panel
• Tb podemos “personalizar” la posición del
componente con atributos padding dentro de VerticalLayout
• Puedes tb arrastrar otros componentes dentro
Instanciar componentes MXML
• Si el componente personalizado MXML representa
un objeto visual tnato un contenedor como un control, lo más habitual es instanciarlo usando código MXML.
• Debemos declarar un namespace personalizado que
asocia con la carpeta que almacenada el fichero fuente mxml del componente
• Podemos indicar la carpeta con todos los
• <s:Application
xmlns:fx=”http://ns.adobe.com/mxml/2009”
• xmlns:s=”library://ns.adobe.com/flex/spark”
• xmlns:mx=”library://ns.adobe.com/flex/mx”
• xmlns:components=”components.*”>
•
añadir el componente a un fichero MXML
• Creamos un nuevo fichero MXML
• colocas el curso después de Application pero
no dentro de Declarations
• escribes <nombre componente
• lo cierras con />
• en la etiqueta Application nos añade el
namespace necesario
Solución – UseComponent.mxml
<?xml version=”1.0” encoding=”utf-8”?>
<s:Application xmlns:fx=”http://ns.adobe.com/mxml/2009” xmlns:s=”library://ns.adobe.com/flex/spark”
xmlns:mx=”library://ns.adobe.com/flex/mx” xmlns:components=”components.*”>
<s:layout>
<s:VerticalLayout horizontalAlign=”center” paddingTop=”20”/> </s:layout>
• Tb lo puedes hacer desde vista Design
• Debemos arrastrar el componente
personalizado desde el panel Components
– si el namespace no ha sido creado, Flash Builder
Instanciar componente personalizado con AS -
UseComponentWithAS.mxml
<?xml version=”1.0” encoding=”utf-8”?>
<s:Application xmlns:fx=”http://ns.adobe.com/mxml/2009” xmlns:s=”library://ns.adobe.com/flex/spark” xmlns:mx=”library://ns.adobe.com/flex/mx” creationComplete=”app_creationCompleteHandler(event)”> <fx:Script> <![CDATA[ import components.MyComponent_Complete; import mx.events.FlexEvent;
protected var comp:MyComponent_Complete;
protected function app_creationCompleteHandler(event:FlexEvent):void {
comp = new MyComponent_Complete(); comp.x = 100;
comp.y = 100;
this.contentGroup.addElement(comp); }
]]>
Objetos miembro
• Los componentes y las clases pueden tener objetos miembro.
• Un objeto miembro es un elemento predeclarado que está
instanciado en la clase.
• Las clases de AS soportan los objetos miembro:
– Properties.
• tiene valores dinámicos – Constants.
• tienen valores fijos – Methods.
• ejecutan acciones – Events.
• envian mensajes a otras partes de la aplicación – Styles.
Declarar una propiedad
• la sintaxis para declarar una propiedad es:
– [access modifier] var [variable name]:[data type];
• Una propiedad llamada propiedad1 con un
tipo de dato String sería:
– public var propiedad1:String;
• Podemos establecer una valor inicial a la
propiedad:
Propiedades static
• Una propiedad static es un valor a la que podemos
hacer referencia desde cualquier parte de la aplicación desde la definición de clase
• Para hacer una propiedad static, añadimos static
delante o detrás del modificador de acceso – public static var myStaticVar:String;
• para referirnos a la propiedad, usamos el nombre de
clase com prefijo
Propiedad bindable
• Las propiedades son bindable solo si
explícitamente las hemos marcado con la etiqueta [Bindable]
• Siempre comunica los cambios en su value a
todos los objetos dentro del componente.
• Si la propiedad es public, comunica los
Ejemplo propiedad bindable
• Creamos un componente personalizado
basado en un Group
• Este componente puede ser una Label que
Solución - CompWithBindableProp
<?xml version=”1.0” encoding=”utf-8”?>
<s:Group xmlns:fx=”http://ns.adobe.com/mxml/2009” xmlns:s=”library://ns.adobe.com/flex/spark” xmlns:mx=”library://ns.adobe.com/flex/mx” width=”400” height=”300”> <fx:Script> <![CDATA[ [Bindable]
public var valueToDisplay:String; ]]>
</fx:Script>
Declarar propiedades con MXML
• <fx:String id=”valueToDisplay”/>
• Cualquier propiedad declarada por esta vía,
implícitamente está marcada como public y bindable .
• Al declarar una propiedad usando MXML,
debemos envolverla dentro de <fx:Declarations> .
<?xml version=”1.0” encoding=”utf-8”?>
<s:Group xmlns:fx=”http://ns.adobe.com/mxml/2009” xmlns:s=”library://ns.adobe.com/flex/spark”>
<fx:Declarations>
<fx:String id=”mxmlVar”/> </fx:Declarations>
Pasar datos a una propiedad
• Podemos pasar datos a una propiedad tanto
declarada con As como MXML.
• Para pasar datos usando una declaración MXML:
– declaramos la propiedad como un atributo XML del
objeto y ponemos su valor con un valor literal o con una binding expression
• con literal
– <components:MyComponent valueToDisplay=”hola”/>
• con binding expression
Constantes
• Una constante es una propiedad cuyo valor
está establecido cuando se declara y nunca cambia.
– private const ALLPRODUCTS:String=”All Products”; – public static const SELECTED:String=”selected”;
• Puesto que el valor de la constante nunca
cambia, no tiene sentido marcarla como bindable.
• Si se marca con la etiqueta [Bindable] el
Métodos
• Se trata de una función que pertenece a una
clase o a un componente.
• En el contexto de las definiciones de clase, un
método define cómo una clase puede realizar una tarea concreta
• Tb se puede considerar un método como una
función o una subrutina.
• De hecho, en AS los métodos se marcan con la
Definir un método
– [access modifier] function [methodName]( – [argument declarations] ):[data type]
– { – }
• Un ejemplo de método podría ser
– public function getValue():String – {
Modificadores de acceso en los métodos
• Al igual que las propiedades, los métodos son
marcados con uno de los cuatro modificadores de acceso : public, private, protected y
internal.
• Si no incluimos un modificador, el acceso por
Ejemplo
• Crear un componente con
– dos propiedades públicas para el nombre y
apellido
• deben ser bindables?
– un método getFullName() que devuelva la cadena
concatenada
Solución - CompWithPublicMethod
<?xml version="1.0" encoding="utf-8"?>
<s:Panel xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" width="200" height="150">
<s:layout>
<s:VerticalLayout paddingLeft="10" paddingTop="10"/> </s:layout>
<fx:Script> <![CDATA[ [Bindable]
public var firstName:String;
[Bindable]
public var lastName:String
public function getFullName():String
{
return firstName + " " + lastName;
} ]]>
</fx:Script>
Ejemplo
• Ahora debemos llamar a los métodos del
componente
• Lo podemos hacer con sentencias AS o con
Aplicación que llama al método del componente con una binding expression
UseComponentWithMethod.mxml
<?xml version=”1.0” encoding=”utf-8”?>
<s:Application xmlns:fx=”http://ns.adobe.com/mxml/2009” xmlns:s=”library://ns.adobe.com/flex/spark”
xmlns:mx=”library://ns.adobe.com/flex/mx” xmlns:components=”components.*”>
<s:layout>
<s:VerticalLayout horizontalAlign=”center” paddingTop=”20” gap=”20”/> </s:layout>
<components:CompWithPublicMethod id=”myComp”
firstName=”juan” lastName=”lopez”/>
• Cuando llamas a un método del componente
sin argumentos en una binding expression, se ejecuta sólo en la construcción inicial del
objeto (cuando la aplicación arranca).
• Esta sintaxis no tiene un sistema para decirle a
Flex que el método podría llamarse otra vez
– <s:Label text=”{myComp.getFullName()}”/>
• los valores de la propiedad del componente se
pasan con expresiones que enlazan con controles visuales en la aplicación y la
Llamar a un método de componente con AS -
CallComponentMethodWithAS
<?xml version=”1.0” encoding=”utf-8”?>
<s:Application xmlns:fx=”http://ns.adobe.com/mxml/2009” xmlns:s=”library://ns.adobe.com/flex/spark”
xmlns:mx=”library://ns.adobe.com/flex/mx” xmlns:components=”components.*”>
<s:layout>
<s:VerticalLayout horizontalAlign=”center” paddingTop=”20”/> </s:layout> <components:CompWithPublicMethod id=”myComp” firstName=”{firstNameInput.text}” lastName=”{lastNameInput.text}”/> <s:TextInput id=”firstNameInput”/> <s:TextInput id=”lastNameInput”/> <s:Label id=”fullNameOutput”/> <s:Button label=”Get Full Name”
Librerías de componentes
• Un component library es un fichero en
formato ZIP que tiene una extensión .swc
• Son compatibles con aplicación Flex creadas
con:
– Flash CS3 o CS4
– Flex SDK en línea de comandos
– Un proyecto Flex Library creado y gestionado en
Crear library project
• File - New -Flex Library Project • En el asistente
– ponemos un nombre
– indicamos su ubicación
– si vamos a incluir las librerías para Adobe AIR
• en la siguiente ventana
– si debemos incluir alguna imagen o algún fichero XML lo
indicamos en la ficha Assets
• se pueden añadir después desde Propiedades del proyecto
Crear componente en la librería
• La carpeta raíz es src
• Aquí podemos crear un paquete
– boton derecho en src – new – package
• Dentro del paquete podemos crear un MXML component
• una vez construido el componente
– project – build
• El fichero swc es un fichero comprimido en
formato ZIP
• Contiene un fichero SWF con los componentes
y clases en código compilado y un fichero en formato XML catalog.xml que lista los
fxp y fxpl
• Al exportar un Flex Project library en el nuevo
Usar componentes de librerías
• Podemos incorporar componentes de librería
en nuestra aplicación Flex de dos maneras:
– Añadir la librería al source path del Flex Project
Añadir librería al path
• Cada Flex Project tiene una build path que consiste
en una lista de carpentas y librerías de componentes que muestras las clases y componentes disponibles para el proyecto.
• La build path incluye una source path de carpetas en
donde el código fuente As y MXML se almacena y una library path que indica las librerias de
componentes compilados
• El build path se establece en las propiedades del
• Seleccionamos el Flex Project
• Project – Properties – Build Path – click en
Library path
– hay varías vías para incluir la librería
– debemos asegurarnos que el proyecto de librería
está abierto
– Tb podríamos copiar el fichero swc en la carpeta