[Flex]初期化系イベントめも
Applicationコンポーネントで初期処理を行う場合のイベントハンドラについてメモ。普通にcreationCompleteを使ってたわけですが、よく見ると初期化系っぽいイベントが何個かあるわけです。
- applicationComplete
- creationComplete
- initialize
- preinitialize
気になったので確認してみる。
テストコードその1
とりあえずイベント全部載せなApplicationコンポーネントのみっていうソース。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
activate="traceEvent(event)"
add="traceEvent(event)"
added="traceEvent(event)"
addedToStage="traceEvent(event)"
applicationComplete="traceEvent(event)"
childAdd="traceEvent(event)"
childIndexChange="traceEvent(event)"
childRemove="traceEvent(event)"
click="traceEvent(event)"
creationComplete="traceEvent(event)"
currentStateChange="traceEvent(event)"
currentStateChanging="traceEvent(event)"
dataChange="traceEvent(event)"
deactivate="traceEvent(event)"
doubleClick="traceEvent(event)"
dragComplete="traceEvent(event)"
dragDrop="traceEvent(event)"
dragEnter="traceEvent(event)"
dragExit="traceEvent(event)"
dragOver="traceEvent(event)"
dragStart="traceEvent(event)"
effectEnd="traceEvent(event)"
effectStart="traceEvent(event)"
enterFrame="traceEvent(event)"
enterState="traceEvent(event)"
error="traceEvent(event)"
exitState="traceEvent(event)"
focusIn="traceEvent(event)"
focusOut="traceEvent(event)"
hide="traceEvent(event)"
initialize="traceEvent(event)"
invalid="traceEvent(event)"
keyDown="traceEvent(event)"
keyFocusChange="traceEvent(event)"
keyUp="traceEvent(event)"
mouseDown="traceEvent(event)"
mouseDownOutside="traceEvent(event)"
mouseFocusChange="traceEvent(event)"
mouseMove="traceEvent(event)"
mouseOut="traceEvent(event)"
mouseOver="traceEvent(event)"
mouseUp="traceEvent(event)"
mouseWheel="traceEvent(event)"
mouseWheelOutside="traceEvent(event)"
move="traceEvent(event)"
preinitialize="traceEvent(event)"
remove="traceEvent(event)"
removedFromStage="traceEvent(event)"
render="traceEvent(event)"
resize="traceEvent(event)"
rollOut="traceEvent(event)"
rollOver="traceEvent(event)"
scroll="traceEvent(event)"
show="traceEvent(event)"
tabChildrenChange="traceEvent(event)"
tabEnabledChange="traceEvent(event)"
tabIndexChange="traceEvent(event)"
toolTipCreate="traceEvent(event)"
toolTipEnd="traceEvent(event)"
toolTipHide="traceEvent(event)"
toolTipShow="traceEvent(event)"
toolTipShown="traceEvent(event)"
toolTipStart="traceEvent(event)"
updateComplete="traceEvent(event)"
valid="traceEvent(event)"
valueCommit="traceEvent(event)"
>
<mx:Script>
<![CDATA[
private function traceEvent(event:Event):void
{
trace(new Date().getTime()+":"+event.type);
}
]]>
</mx:Script>
</mx:Application>
traceの出力結果は以下な感じ。
1208916907203:resize 1208916907219:added 1208916907219:add 1208916907250:preinitialize 1208916907250:initialize 1208916907281:enterFrame 1208916907328:enterFrame 1208916907328:added 1208916907344:added 1208916907344:creationComplete 1208916907359:added 1208916907359:addedToStage 1208916907359:applicationComplete 1208916907359:updateComplete 1208916907469:enterFrame 1208916908578:enterFrame 1208916909656:enterFrame : : (enterFrameが続く...) :
おぅ!creationCompleteがaddedToStageより前に発生してる。stageにアクセスできねーじゃん。applicationCompleteを初期処理のイベントハンドラとするのが正しいようですね。
テストコードその2
子コンポーネントがある時のイベント発生順も気になったので書いてみた。こちらはFlexなイベントのみにしてみた。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
add="traceEvent(event)"
applicationComplete="traceEvent(event)"
childAdd="traceEvent(event)"
childIndexChange="traceEvent(event)"
childRemove="traceEvent(event)"
creationComplete="traceEvent(event)"
currentStateChange="traceEvent(event)"
currentStateChanging="traceEvent(event)"
dataChange="traceEvent(event)"
dragComplete="traceEvent(event)"
dragDrop="traceEvent(event)"
dragEnter="traceEvent(event)"
dragExit="traceEvent(event)"
dragOver="traceEvent(event)"
dragStart="traceEvent(event)"
effectEnd="traceEvent(event)"
effectStart="traceEvent(event)"
enterState="traceEvent(event)"
error="traceEvent(event)"
exitState="traceEvent(event)"
hide="traceEvent(event)"
initialize="traceEvent(event)"
invalid="traceEvent(event)"
mouseDownOutside="traceEvent(event)"
mouseWheelOutside="traceEvent(event)"
move="traceEvent(event)"
preinitialize="traceEvent(event)"
remove="traceEvent(event)"
resize="traceEvent(event)"
scroll="traceEvent(event)"
show="traceEvent(event)"
toolTipCreate="traceEvent(event)"
toolTipEnd="traceEvent(event)"
toolTipHide="traceEvent(event)"
toolTipShow="traceEvent(event)"
toolTipShown="traceEvent(event)"
toolTipStart="traceEvent(event)"
updateComplete="traceEvent(event)"
valid="traceEvent(event)"
valueCommit="traceEvent(event)"
>
<mx:Script>
<![CDATA[
private function traceEvent(event:Event):void
{
if(event.currentTarget==p2){
trace("\t\t"+new Date().getTime()+":"+event.type);
}else if(event.currentTarget==p){
trace("\t"+new Date().getTime()+":"+event.type);
}else{
trace(new Date().getTime()+":"+event.type);
}
}
]]>
</mx:Script>
<mx:Panel id="p"
add="traceEvent(event)"
childAdd="traceEvent(event)"
childIndexChange="traceEvent(event)"
childRemove="traceEvent(event)"
creationComplete="traceEvent(event)"
currentStateChange="traceEvent(event)"
currentStateChanging="traceEvent(event)"
dataChange="traceEvent(event)"
dragComplete="traceEvent(event)"
dragDrop="traceEvent(event)"
dragEnter="traceEvent(event)"
dragExit="traceEvent(event)"
dragOver="traceEvent(event)"
dragStart="traceEvent(event)"
effectEnd="traceEvent(event)"
effectStart="traceEvent(event)"
enterState="traceEvent(event)"
exitState="traceEvent(event)"
hide="traceEvent(event)"
initialize="traceEvent(event)"
invalid="traceEvent(event)"
mouseDownOutside="traceEvent(event)"
mouseWheelOutside="traceEvent(event)"
move="traceEvent(event)"
preinitialize="traceEvent(event)"
remove="traceEvent(event)"
resize="traceEvent(event)"
scroll="traceEvent(event)"
show="traceEvent(event)"
toolTipCreate="traceEvent(event)"
toolTipEnd="traceEvent(event)"
toolTipHide="traceEvent(event)"
toolTipShow="traceEvent(event)"
toolTipShown="traceEvent(event)"
toolTipStart="traceEvent(event)"
updateComplete="traceEvent(event)"
valid="traceEvent(event)"
valueCommit="traceEvent(event)"
>
<mx:Panel id="p2"
add="traceEvent(event)"
childAdd="traceEvent(event)"
childIndexChange="traceEvent(event)"
childRemove="traceEvent(event)"
creationComplete="traceEvent(event)"
currentStateChange="traceEvent(event)"
currentStateChanging="traceEvent(event)"
dataChange="traceEvent(event)"
dragComplete="traceEvent(event)"
dragDrop="traceEvent(event)"
dragEnter="traceEvent(event)"
dragExit="traceEvent(event)"
dragOver="traceEvent(event)"
dragStart="traceEvent(event)"
effectEnd="traceEvent(event)"
effectStart="traceEvent(event)"
enterState="traceEvent(event)"
exitState="traceEvent(event)"
hide="traceEvent(event)"
initialize="traceEvent(event)"
invalid="traceEvent(event)"
mouseDownOutside="traceEvent(event)"
mouseWheelOutside="traceEvent(event)"
move="traceEvent(event)"
preinitialize="traceEvent(event)"
remove="traceEvent(event)"
resize="traceEvent(event)"
scroll="traceEvent(event)"
show="traceEvent(event)"
toolTipCreate="traceEvent(event)"
toolTipEnd="traceEvent(event)"
toolTipHide="traceEvent(event)"
toolTipShow="traceEvent(event)"
toolTipShown="traceEvent(event)"
toolTipStart="traceEvent(event)"
updateComplete="traceEvent(event)"
valid="traceEvent(event)"
valueCommit="traceEvent(event)"
>
</mx:Panel>
</mx:Panel>
</mx:Application>
結果は以下。
1208918071007:resize 1208918071022:add 1208918071038:preinitialize 1208918071054:childAdd 1208918071054:add 1208918071069:preinitialize 1208918071069:childAdd 1208918071069:add 1208918071069:preinitialize 1208918071069:initialize 1208918071100:initialize 1208918071100:initialize 1208918071210:resize 1208918071210:move 1208918071225:resize 1208918071241:creationComplete 1208918071241:updateComplete 1208918071241:creationComplete 1208918071241:updateComplete 1208918071241:creationComplete 1208918071257:applicationComplete 1208918071257:updateComplete
こーみると、子コンポーネントから順に作成されてるのがよく分かる。おもしろい。

Comment