2012-04-04 6 views
1

Ich habe eine geschützte Funktion in einem Skriptblock einer Komponente in mxml wie so definiert definiert:Override-Funktion der Instanz von Funktion in MXML-Komponente Skriptblock definiert

<s:VGroup 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="onCreationComplete()"> 
    <fx:Script> 
    <![CDATA[ 
    protected function onCreationComplete():void { 

    } 
    ... 

Ist es möglich, die Funktion in einem außer Kraft zu setzen Beispiel der Komponente wie folgt:

<gen:CreateObjectFormSubmit id="formSubmit"> 
    <fx:Script> 
    <![CDATA[ 
      override protected function onCreationComplete():void { 
       form=form1; 
      } 
    ]]> 
    </fx:Script> 
+0

Ihre Probe sollte perfekt funktionieren! Was ist das Problem ? –

Antwort

1

Seien Sie vorsichtig, wo und wie Sie Ihre Superklasse deklarieren. Von der oben angegebenen Syntax scheint es, dass Sie versuchen, eine <Komponente> Tag in Ihrer mxml-Klasse zu deklarieren, in der, wenn dies der Fall ist - der Compiler behandelt dies als ein separates Kind-Objekt und nicht eine tatsächliche Erweiterung.

Zum einen können root-Level-Tags keine ID deklarieren (aber Komponenten können - und dies wird der Klassenname), und Sie müssten wahrscheinlich alle Ihre XML-Namespaces explizit deklarieren.

Damit es sich um eine echte Erweiterung handelt, müsste Ihre erste <VGroup> Klasse CreateObjectFormSubmit heißen, dies wird zum Stamm-Tag Ihrer Erweiterungsklasse. Es gibt jedoch ein Problem: Wenn Sie von einer mxml-Klasse ausgehen, können Sie keine zusätzlichen untergeordneten Elemente deklarieren (in mxml-Notation aufgrund von Layoutregeln).

Wenn, wie Sie sagt einer Instanz Ihre Klasse, dann würden keine Sie nicht in der Lage sein, es zu überschreiben, da der Funktionsumfang des <Script> Tages noch innerhalb der Root-Ebene befinden würde. Dies wird manchmal auch als 'outerDocument' bezeichnet, wenn <Komponente> Tags deklariert werden.

Die oben wäre nicht anders es in regelmäßigen tun AS wie folgt aus:

class SomethingCool extends UIComponent { 
    ... 
    public function addButtons():void 
    { 
     var btn:Button = new Button(); 
      btn.id = 'formSubmit'; 
      //can't declare an override of Button here 
    } 
} 
+0

Dies ist, was ich mit dieser Frage gemeint habe, ich weiß nicht, warum ich dachte, dass es eine anonyme Klassenerweiterung in Flex geben würde. – MetaChrome

4

Sicher, Sie können. Die MXML-Komponente ist eine Klasse. Wenn Sie also Komponente B basierend auf Komponente A erstellen (B erbt von A), können Sie Methoden von A in B überschreiben.

1

um jede Funktion außer Kraft zu setzen, die Sie überschreiben möchten in der Elternklasse der aktuellen Klasse verfügbar sein.

public class A { 
    public function methodtooverride():void{ 
    trace('in class A'); 
    } 
} 

public class B extends A { 
    override public function methodtooverride():void{ 
    trace('in class B'); 
    } 
}