Frage

Ich habe eine MXML mit einer Form, und im Innern, zwei TextInputs. Ich hasse es innerhalb der MXML-Datei jedes Stück Code mit (Ich komme aus einer JavaScript-Bildung) so verwende ich ein

mx:Script source="external.as"

-Tag beliebigen Code in jeder MXML-Datei verwendet aufzunehmen. Das Problem ist, dass, wenn ich diesen Code auf der external.as-Datei:

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

Wo marketInput, segmentInput, priceLowInput und priceHighInput sind TextInputs in der MXML-Datei definiert. Als ich nach complile versuchen erhalte ich einen 1120: Zugriff auf nicht definierte Eigenschaft XXXXX

Ich habe versucht, diese Zeilen Zugabe vor der Funktion:

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

Aber anstatt ich ein 1151:. Es besteht ein Konflikt mit der Definition XXXX im Namensraum interne , die absolut Sinn macht

Gibt es eine Möglichkeit, dies zu tun, ohne alle Eingänge Verweise auf die Funktion als Parameter davon passieren zu müssen?

War es hilfreich?

Lösung

Doing ein "Code-Behind" in Flex schmerzhaft ist. Es gibt kein Konzept von Teilklassen oder die Flexibilität der prototypische Vererbung wie in Javascript. Google für "Code-Behind in flex" für viele Ressourcen.

Ich denke, es ist besser, Sie auf die Idee der Einbettung Code in mxml gewöhnen. Verwenden Sie Script-Tags Inline-Code so weit wie möglich zu vermeiden. Wenn Sie eine Menge Code in MXML schreiben, vielleicht können Sie den Code in mehr benutzerdefinierten Komponenten neu Faktor. Bonuspunkte, wenn sie wiederverwendbar sind.

Andere Tipps

Sie müssen einen Verweis auf eine Instanz der TextInputs übergeordneten Container erstellen, und dann diese Referenz verwenden, um die TextInputs und ihre Eigenschaften accsess. Ich denke, dass wir eine Klarstellung auf Ihrer Dateistruktur benötigen. Wie erstellen Sie die Instanz des übergeordneten Container? Ich denke, das ist, was Sie tun müssen:

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

Der kanonische Weg, um Code-behind in Flex zu tun ist, über Vererbung. Hier ist eine gute Erklärung aus der Dokumentation: http://learn.adobe.com/wiki / Anzeige / Flex / Code + Hinter . Auf den Punkt gebracht:

  1. Deklarieren Sie eine Actionscript-Klasse als Basisklasse zu verwenden.
  2. Stellen Sie die Basisklasse als Root-Container in Ihrer MXML-Datei.
  3. Für alle Steuerelemente in MXML-Datei deklariert, müssen Sie sie als öffentliche Mitglieder der Basisklasse neu deklarieren exakt die gleichen Namen (genau wie Sie oben für Ihre Skriptblock mit Quelltag tun, nur es funktioniert :-)

So, Actionscript-Datei:

package mypackage
{
    import mx.controls.TextInput;

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

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

Und die entsprechende MXML-Datei:

<?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 für Ihre andere TextInput- Kontrollen. Und jetzt Ihre populateFromForm Funktion sollte funktionieren.

Es ist eine Art von abscheulichen die gleichen Einheiten zweimal neu deklarieren zu haben, aber es ist nicht ganz die Tüte verletzt die frühere Befragten es gemacht sein aus (obwohl es möglich ist, dies änderte sich in Flex 4, um es weniger zu machen schmerzhaft, als es war ).

  • importieren diese in .AS:

    import mx.core.Application;

  • in den .AS verwenden diese:

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

haben Sie einen Skript-Tag in MXML-Datei, die in der Actionscript-Datei verweist?


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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top