Domanda

Ho un MXML con una forma, e al suo interno, due TextInputs. Odio dover qualsiasi pezzo di codice all'interno del file MXML (io vengo da una formazione JavaScript) in modo da utilizzare un

mx:Script source="external.as"

tag per includere qualsiasi codice utilizzato in qualsiasi file MXML. Il problema è che se ho questo codice nel file external.as:

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

Dove marketInput, segmentInput, priceLowInput e priceHighInput sono TextInputs definite nel file MXML. Quando provo a complile ho un 1120: L'accesso alla proprietà non definita XXXXX

Ho provato ad aggiungere queste righe prima della funzione:

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

Ma invece ho un 1151:. Esiste un conflitto con la definizione XXXX nel namespace interno , che ha perfettamente senso

C'è un modo per farlo senza dover passare tutti i riferimenti di ingresso alla funzione come parametri di esso?

È stato utile?

Soluzione

fare un "code-behind" è doloroso in Flex. Non esiste il concetto di classi parziali o la flessibilità di ereditarietà prototipale come in Javascript. Google per "code-behind in flex" per molte risorse.

Credo che sia meglio che ci si abitua all'idea di incorporare codice MXML. Utilizzare tag di script evitando codice inline, per quanto possibile. Se si deve scrivere un sacco di codice all'interno MXML, forse si può decidere di ri-factor il codice in più componenti personalizzati. I punti di bonus se sono riutilizzabili.

Altri suggerimenti

È necessario creare un riferimento a un'istanza di contenitore padre dei TextInputs', e quindi utilizzare tale riferimento ai accsess le TextInputs e le loro proprietà. Penso che abbiamo bisogno di qualche chiarimento sulla struttura del file. Come stai creando l'istanza del contenitore padre? Sto pensando che questo è ciò che devi fare:

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

Il modo più tradizionale per fare code-behind in Flex è attraverso l'ereditarietà. Ecco una buona spiegazione dalla documentazione: http://learn.adobe.com/wiki / display / Flex / Codice + Dietro . In poche parole:

  1. Dichiarare una classe ActionScript da utilizzare come classe di base.
  2. Imposta la classe di base come il contenitore principale nel file MXML.
  3. Per eventuali controlli dichiarati nel file MXML, è necessario ridichiarare loro come membri pubblici della classe base utilizzando esattamente lo stesso nome (esattamente come si sta facendo qui sopra per il vostro blocco di script con tag di origine, solo funziona :-)

Quindi, il file ActionScript:

package mypackage
{
    import mx.controls.TextInput;

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

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

E il file MXML corrispondente:

<?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>

Et cetera per gli altri controlli TextInput. E ora la funzione populateFromForm dovrebbe funzionare.

E 'sorta di odioso dover ridichiarare stesse entità per due volte, ma non è del tutto la borsa di ferire il convenuto in precedenza ha fatto fuori per essere (anche se è possibile questo è cambiato in Flex 4 per renderlo meno doloroso di quanto non fosse ).

  • importare questo in .AS:

    import mx.core.Application;

  • nelle .AS usano questo:

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

hai un tag script nel file MXML che punta al file ActionScript?


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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top