flex application初始化順序

2021-08-23 11:27:15 字數 3930 閱讀 3385

然後才是

preinitialize

在所有的初始化之前觸發,沒有子元件的定義,但是可以引用元件的變數.

initialize

當所有子元件生成完成後觸發,在這個時間點還沒有元件被渲染出來.

creationcomplete

元件定義完成並已經在顯示列表.

所有的元件初始化完成並顯示.

自定義的視覺化元件(uicomponent的子類)只有在呼叫過addchild()後, 才會有乙個systemmanager賦給他們, 之前是null. 所以在自定義視覺化元件的建構函式中不要使用systemmanager.

4. 呼叫createchild(). 此時, 所有應用元件被建立, 所有元件的createchild()被呼叫.

6. 派發creationcomplete事件

flex 是乙個事件驅動的程式設計模型, 任何事情的發生, 其背後必然存在乙個事件. 而開發者第一次看到mxml時, 很難體會到乙個xml標記的應用的事件流和例項化的生命週期. 這個對於html和flash的開發者尤其會感到困惑, 因為其熟悉的方式與flex的一點也不相似. html的例項化是從上到下的, flash的執行是從frame0開始一幀幀執行的. 而flex則又有不同.

從我們開始學習flex時, 我們就需要了解事件流和mxml的例項化. 我非常困惑因為我實在難以理解什麼樣的事件會被觸發或者事件什麼時候會被觸發. 關鍵是要理解事件的基礎並親自觀察事件流的初始化.

我們來看乙個簡單的mxml的應用.

<?xml version=」1.0″ encoding=」utf-8″?>

xmlns:mx=」

layout=」absolute」

backgroundgradientcolors=」[#67cbff, #fcffff]」

color=」#000000″

fontsize=」12″

preinitialize=」report( event , 『preinitialize』 )」

initialize=」report( event , 『initialize』 )」

creationcomplete=」report( event , 『creationcomplete』 )」

>

> 『

+ event.currenttarget + 『.』 + value + 『\n』;

}]]>

hello!』 )」

/>

goodbye!』 )」

/>

這個應用執行時, 輸出了例項流程和事件流. 這校我們就能夠看到所有事件的觸發順序. 可以發現應用啟動後, 事件的順序是一定的. 下面是輸出的內容:

167ms >> eventflow0.preinitialize

183ms >> eventflow0.outtextarea.initialize

187ms >> eventflow0.hellobutton.initialize

188ms >> eventflow0.goodbyebutton.initialize

189ms >> eventflow0.clearbutton.initialize

189ms >> eventflow0.initialize

243ms >> eventflow0.outtextarea.creationcomplete

243ms >> eventflow0.hellobutton.creationcomplete

243ms >> eventflow0.goodbyebutton.creationcomplete

244ms >> eventflow0.clearbutton.creationcomplete

244ms >> eventflow0.creationcomplete

1807ms >> eventflow0.hellobutton.rollover

2596ms >> eventflow0.hellobutton.rollout

2954ms >> eventflow0.hellobutton.rollover

3170ms >> eventflow0.hellobutton.rollout

3543ms >> eventflow0.hellobutton.rollover

4052ms >> eventflow0.hellobutton.click > hello!

4267ms >> eventflow0.hellobutton.click > hello!

4474ms >> eventflow0.hellobutton.click > hello!

4569ms >> eventflow0.hellobutton.rollout

4907ms >> eventflow0.goodbyebutton.click > goodbye!

5130ms >> eventflow0.goodbyebutton.click > goodbye!

關於creationcomplete事件的發生時機,手冊中是這樣說的:

假設程式中有這樣的結構:

outervbox

innervbox1

innervboxlabel1

innervbox2

innervboxlabel2

事件:preinitialize, initialize, creationcomplete發生的順序是這樣的:

outervbox preinitialize

innervbox1 preinitialize

innervbox1label preinitialize

innervbox1label initialize

innervbox1 initialize

innervbox2 preinitialize

innervbox2label preinitialize

innervbox2label initialize

innervbox2 initialize

outervbox initialize

innerbox1label creationcomplete

innervbox2label creationcomplete

innervbox1 creationcomplete

innervbox2 creationcomplete

outervbox creationcomplete

如果將 outervbox容器變成viewstack並且creationpolicy 屬性為auto, 則事件發生順序是:

outerviewstack preinitialize

innervbox1 preinitialize

innervbox2 preinitialize

outerviewstack initialize

innerbox1label preinitialize

innerbox1label initialize

innervbox1 initialize

innerbox1label creationcomplete

innervbox1 creationcomplete

outerviewstack creationcomplete

然而,對於item renderer 或者 item editor, flex 可能會重用item renderer 或者item editor的例項。但是被重用的renderer 或者item editor的例項不會再次發生creationcomplete事件。作為替代,你可以使用datachange事件。flex 會在每次data屬性發生變化時觸發datachange事件。在accessing the listdata property(flex2 help中)一節中的例子就使用了datachange事件來更新在datagrid控制項的item renderer中的textarea的內容。

Flex Application 初始化順序

demo xmlns mx layout absolute backgroundgradientcolors 67cbff,fcffff color 000000 fontsize 12 preinitialize report event preinitialize initialize repo...

Flex Application 初始化順序

然後才是 preinitialize 在所有的初始化之前觸發,沒有子元件的定義,但是可以引用元件的變數.initialize 當所有子元件生成完成後觸發,在這個時間點還沒有元件被渲染出來.creationcomplete 元件定義完成並已經在顯示列表.所有的元件初始化完成並顯示.自定義的視覺化元件 ...

Flex Application 初始化順序

然後才是 preinitialize 在所有的初始化之前觸發,沒有子元件的定義,但是可以引用元件的變數.initialize 當所有子元件生成完成後觸發,在這個時間點還沒有元件被渲染出來.creationcomplete 元件定義完成並已經在顯示列表.所有的元件初始化完成並顯示.自定義的視覺化元件 ...