然後才是
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 元件定義完成並已經在顯示列表.所有的元件初始化完成並顯示.自定義的視覺化元件 ...