2011-09-22 13 views
7

Perché il linguaggio mxml del framework Flex non supporta un costruttore per i componenti o accetta gli argomenti del costruttore per i componenti? Per quanto ne so non è possibile dichiarare un oggetto ActionScript in mxml se prende gli argomenti del costruttore. Sono curioso del motivo. È una scelta di design di Adobe o relativa a come funzionano le lingue dichiarative? Ad esempio, perché non permettere:Perché mxml non supporta i costruttori di componenti?

<myNameSpace:MyComponent constructor="{argArray}"/> 
+0

forse questo aiuterà: http://stackoverflow.com/questions/878043/how-do-i-populate-required-parameters-in-a-custom-mxml-tag –

+0

Grazie Chris per l'incredibile risposta veloce! Stavo cercando un motivo per cui non è possibile piuttosto che una soluzione alternativa: è qualcosa che generalmente non è possibile nelle lingue dichiarative e perché? –

+0

E come dichiareresti più di un argomento? Li hai sempre in un array? –

risposta

6

Si può leggere IMXMLObject aiuto API per ulteriori informazioni sulla tua domanda. Non stanno dicendo esattamente perché un mxml non supporta i costruttori, ma dice che devi controllare il tuo componente mxml attraverso i suoi eventi del ciclo di vita: preinizializzare, inizializzare e creare Completamento.

Suppongo che sia una decisione di progettazione, considerando che un mxml viene tradotto direttamente nel codice AS3 (è possibile compilare l'applicazione aggiungendo keep-generated-actionscript = true e vedere cosa produce).

4

Anche se una classe è definita in MXML, è possibile implementare un costruttore tramite l'istanziazione di una variabile di istanza come segue. Questo verrà chiamato prima che vengano inviati vari eventi come "preinitialize" o "creationComplete".

<myNameSpace:MyComponent> 
    <fx:Script> 
    <![CDATA[ 
    private var ignored:* = myInstanceConstructor(); 

    private function myInstanceConstructor():* { 
     // Do something - called once per instance 
     return null; 
    } 
    ]]> 
    </fx:Script> 
</myNameSpace:MyComponent> 

Inoltre, variabili di classe possono essere inizializzate in un modo simile come segue.

<myNameSpace:MyComponent> 
    <fx:Script> 
    <![CDATA[ 
    private static var ignored:* = myClassConstructor(); 

    private static function myClassConstructor():* { 
     // Do something - called once per class 
     return null; 
    } 
    ]]> 
    </fx:Script> 
</myNameSpace:MyComponent> 
+0

Grazie mille per la risposta, sembra un approccio molto utile. Proveremo. –

+0

Lo cambierei in 'private const __new __(): * = construct();' non solo per lo zucchero sintattico, ma perché dovrebbe essere immutabile. Farei anche la funzione 'construct() *' 'protected' per ereditarietà. –