flex 3 accediendo al mxml principal desde el código actionscript
(3)
David tiene razón: si bien puede acceder a los miembros públicos de su objeto Application.mxml estáticamente y desde cualquier lugar de su aplicación, en lo que respecta al diseño, eso es un poco negativo. Es mejor esforzarse por un acoplamiento flexible entre los objetos, y la forma en que se hace en el idioma Flex es extender EventDispatcher y enviar eventos. Entonces, por ejemplo, su envoltura de WebService podría verse más o menos así:
public class MyWrapperClass extends EventDispatcher
{
[Event(name="webserviceComplete", type="flash.events.Event")]
public function MyWrapperClass(target:IEventDispatcher=null)
{
super(target);
}
private function handleWebServiceLoadComplete(event:ResultEvent):void
{
dispatchEvent(new Event("webserviceComplete"));
}
public function doWork():void
{
// Load the service, etc., and ultimately call handleWebServiceLoadComplete()...
}
}
... y su archivo Main.mxml como este:
<mx:Script>
<![CDATA[
private function app_creationComplete(event:Event):void
{
var myWrapper:MyWrapperClass = new MyWrapperClass();
myWrapper.addEventListener("webserviceComplete", mywrapper_webServiceComplete, false, 0, true);
myWrapper.doWork();
}
private function mywrapper_webServiceComplete(event:Event):void
{
// Do the work you would''ve otherwise done in the public method
}
]]>
</mx:Script>
En este caso, el resultado final es el mismo: completar la carga del servicio web desencadena la función en Main.mxml. Pero observe cómo mywrapper_webServiceComplete()
se declara de manera privada; MyWrapperClass
no lo llama directamente. Main.mxml simplemente se suscribe (con addEventListener()
) para que se le notifique cuando MyWrapperClass haya terminado de hacer su trabajo, y luego hace su propio trabajo; MyWrapperClass no sabe nada sobre los detalles de la implementación de Main.mxml, ni Main.mxml sabe nada acerca de MyWrapperClass aparte de que distribuye un evento webserviceComplete
y expone un método público de doWork()
. Acoplamiento flojo e información escondida en acción.
¡Buena suerte!
Estoy escribiendo una clase de ActionScript para manejar mis llamadas al servicio web. Cuando recupero un resultado, quiero llamar a un método setter en mi aplicación mxml principal. Mi problema es que no sé cómo acceder a los métodos en la sección de ActionScript de mi clase principal de mxml de mi clase actionscript, ¿alguna idea?
Si su clase es un UIComponent agregado al árbol de componentes, entonces puede usar su atributo parentApplication
. De lo contrario, utilice el atributo static Application.application
, pero solo después de que se haya completado la inicialización de la aplicación. Antes de eso, el campo es null
. Los campos y métodos privados obviamente no se pueden acceder. Los elementos declarados en la parte MXML con id
explícitos son públicos.
Sin embargo, agregar una llamada así crea una unión rígida. Es posible que desee considerar enviar un evento en su lugar, y manejar este evento en la aplicación principal.
En caso de que alguien tenga el mismo problema:
mx.core.FlexGlobals.topLevelApplication.YOUR_FUNCTION
es la sintaxis para acceder a las funciones públicas dentro de main.mxml.