2011-09-22 27 views
7

爲什麼Flex框架的mxml語言不支持組件的構造函數或接受組件的構造函數參數?就我所知,如果它需要構造函數參數,就不可能在mxml中聲明ActionScript對象。我很好奇原因。它是Adobe的設計選擇還是與聲明性語言的工作方式有關?例如,爲什麼不讓:爲什麼mxml不支持組件構造函數?

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

也許這將幫助:http://stackoverflow.com/questions/878043/how-do-i-populate-required-parameters-in-a-custom-mxml-tag –

+0

感謝克里斯令人難以置信快速回答!我更加關注爲什麼這是不可能的,而不是一種解決方法 - 這是通常在聲明性語言中不可能的事情,爲什麼? –

+0

你會如何聲明多個參數?總是讓他們在一個數組? –

回答

6

您可以閱讀IMXMLObject幫助API關於你的問題的更多信息。他們沒有準確地告訴mxml爲什麼不支持構造函數,但它說你必須通過它的生命週期事件來控制你的mxml組件:​​preinitialize,initialize和creationComplete。

我想這是一個設計決策,考慮到mxml被直接轉換爲AS3代碼(您可以編譯您的應用程序,添加keep-generated-actionscript = true並查看它產生的結果)。

4

即使在MXML中定義了一個類,也可以通過實例化一個實例變量來實現一個構造函數,如下所示。這將在諸如「preinitialize」或「creationComplete」之類的各種事件被調度之前被調用。

​​

此外,類變量可以用類似的方式初始化如下。

<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

非常感謝您的回答,看起來非常有用。將嘗試一下。 –

+0

我將它改爲'private const __new __():* = construct();'不僅用於語法糖,而且因爲它應該是不可變的。我也會讓'construct()*'繼承的''''protected''。 –

相關問題