Pregunta

Tengo un MXML con un formulario y dentro de él dos TextInputs.Odio tener cualquier fragmento de código dentro del archivo MXML (vengo de una formación de JavaScript), así que uso un

mx:Script source="external.as"

etiqueta para incluir cualquier código utilizado en cualquier archivo MXML.El problema es que si tengo este código en el external.as archivo:

private function populateFromForm():void{
   var vo:ValidObject= new ValidObject();
   vo.market = marketInput.text;
   vo.segment = segmentInput.text;
   vo.priceLow = priceLowInput.text;
   vo.priceHigh = priceHighInput.text;
}

Donde marketInput, segmentInput, priceLowInput y priceHighInput son entradas de texto definidas en el archivo MXML.Cuando intento completar obtengo un 1120:Acceso a propiedad indefinida XXXXX

Intenté agregar estas líneas antes de la función:

public var marketInput:TextInput;
public var segmentInput:TextInput;
public var priceLowInput:TextInput;
public var priceHighInput:TextInput;

Pero en lugar de eso obtengo un 1151: Existe un conflicto con la definición XXXX en el espacio de nombres interno lo cual tiene mucho sentido.

¿Hay alguna manera de hacer esto sin tener que pasar todas las referencias de entrada a la función como parámetros de la misma?

¿Fue útil?

Solución

haciendo un "código subyacente" es dolorosa en Flex. No existe el concepto de clases parciales o la flexibilidad de la herencia de prototipos como en Javascript. Google de "código subyacente en Flex" durante muchos recursos.

Creo que es mejor que se acostumbre a la idea de la incrustación de código en mxml. Utilice etiquetas de script evitando código en línea tanto como sea posible. Si usted tiene que escribir un montón de código dentro de MXML, tal vez es posible que desee volver a factor de código en múltiples componentes personalizados. Los puntos de bonificación si son reutilizables.

Otros consejos

Es necesario crear una referencia a una instancia de contenedor padre los TextInputs' y, a continuación, utilizar esa referencia a los accsess TextInputs y sus propiedades. Creo que necesitamos algunas aclaraciones sobre la estructura de archivos. ¿Cómo estás creando la instancia del contenedor padre? Estoy pensando que esto es lo que hay que hacer:

MyForm.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:TextInput id="marketInput" />
    <mx:TextInput id="segmentInput" />
    <mx:TextInput id="priceLowInput" />
    <mx:TextInput id="priceHighInput" />
</mx:VBox>

SaveVOContainer.as:

package
{
    public class SaveVoContainer extends Container
    {
        private var myForm:MyForm = new MyForm();

        public function SaveVOContainer
        {
            this.addChild(myForm);
        }

        private function populateFromForm():void{
           var vo:ValidObject= new ValidObject();
           vo.market = myForm.marketInput.text;
           vo.segment = myForm.segmentInput.text;
           vo.priceLow = myForm.priceLowInput.text;
           vo.priceHigh = myForm.priceHighInput.text;
        }
    }
}

La forma canónica de hacer de código subyacente en Flex es a través de la herencia. Aquí hay una buena explicación de los documentos: http://learn.adobe.com/wiki / pantalla / Flex / Código + Detrás . En pocas palabras:

  1. Declarar una clase de ActionScript para utilizar como clase base.
  2. Establecer la clase base que el contenedor raíz en su archivo MXML.
  3. Para los controles declarados en el archivo MXML, usted tiene que redeclararlas como miembros públicos de la clase base con el mismo nombre (exactamente como lo están haciendo por encima de su bloque de script con etiqueta de origen, solamente funciona :-)

Por lo tanto, el archivo de ActionScript:

package mypackage
{
    import mx.controls.TextInput;

    public class myClass extends WindowedApplication
    {
        public var marketInput:TextInput;

        private function populateFromForm():void{
            /* As above */
        }
    }
}

Y el archivo MXML correspondiente:

<?xml version="1.0" encoding="utf-8"?>
<custom:myClass xmlns:custom="mypackage.*"
        xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:mx="library://ns.adobe.com/flex/mx">
    <mx:TextInput id="marketInput"/>
</custom:myClass>

Etcétera para sus otros controles TextInput. Y ahora su función populateFromForm debería funcionar.

Es una especie de atroz a tener que redeclare las mismas entidades en dos ocasiones, pero no es bastante la bolsa de daño a la parte demandada anterior hizo que fuera a ser (aunque es posible que esto cambió en Flex 4 para que sea menos dolorosa de lo que era ).

  • importar esto en .AS:

    import mx.core.Application;

  • en los .AS utilizan este:

    mx.core.Application.application.component.property = value; mx.core.Application.application.myText.text = 'test';

¿tiene una etiqueta de script en el archivo MXML que señala al archivo de ActionScript?


<mx:Script source='includes/foo.as' />

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top