kagamihogeの日記

kagamihogeの日記です。

yui-frameworks 使う時の初期化処理書くところ

Flex/AIR開発でデザイナとの協業を楽にする「yui」(1/3) - @ITyuiを使ったFlexアプリを作って、便利さを体感しよう(1/4) - @IT にも書いてあるんだけど、まぁ一応メモ。

public class HogeAction {
    public function onAssembleCompleteHandler( event:FrameworkEvent ):void{
        trace("onAssembleCompleteHandler");
    }

    public function onApplicationStartHandler( event:FrameworkEvent ):void{
        trace("onApplicationStartHandler");
    }

コレを実行するとログにはこう出てくる。AssembleComplete の方が先、ってことですな。


onAssembleCompleteHandler
2008/11/01 16:39:10 [YuiFrameworkContainer] DEBUG - main0.hogeView is assembled.
2008/11/01 16:39:10 [YuiFrameworkContainer] DEBUG - application assemble end.
2008/11/01 16:39:10 [YuiFrameworkContainer] DEBUG - application start...
onApplicationStartHandler

具体的にどうタイミングが違う、ってのはフレームワーク内のコード追わないとわからないんだけど。その前に一つ実験。xxxView (実験では Panel を使用)そのもの対する MouseMoveHandler を追加する。で、アプリを起動したあとマウスをグリグリ動かしてみる。

public class HogeAction {
    public function onAssembleCompleteHandler( event:FrameworkEvent ):void{
        trace("onAssembleCompleteHandler");
    }

    public function onApplicationStartHandler( event:FrameworkEvent ):void{
        trace("onApplicationStartHandler");
    }
    
    public function onMouseMoveHandler(event:MouseEvent):void {
        trace("onMouseMoveHandler:" + event);
    }

実行ログはというと。


(略)
2008/11/01 16:42:20 [EventHandlerCustomizer] DEBUG - hogeView.addEventListener(mouseMove,onMouseMoveHandler) on HogeView.
onAssembleCompleteHandler
2008/11/01 16:42:20 [YuiFrameworkContainer] DEBUG - main0.hogeView is assembled.
2008/11/01 16:42:20 [YuiFrameworkContainer] DEBUG - application assemble end.
onMouseMoveHandler:[MouseEvent type="mouseMove"(略)
onMouseMoveHandler:[MouseEvent type="mouseMove"(略)
2008/11/01 16:42:20 [YuiFrameworkContainer] DEBUG - application start...
onApplicationStartHandler
onMouseMoveHandler:[MouseEvent type="mouseMove"(略)

AssembleComplete 後で MouseEvent が拾えるようになってますね。AssembleComplete と ApplicationStart は、どっちも初期化処理書く場所として使えるけど、タイミングの違いがある、ってコトに気をつけないとハマりそうな予感。

onAssembleCompleteHandlerで対象となっているAssembleCompleteイベントは、Viewごとにすべての自動イベント登録を完了した際に送出されるイベントです。つまり、イベントハンドラが登録されていることが保証され、確実にイベントハンドラの呼び出しを約束します。

yuiを使ったFlexアプリを作って、便利さを体感しよう(3/4) - @IT より抜粋

……の通りの動作をしていることが確認できた、と思います。



が、↓のイベントハンドラは動かない。何か設定ミスってるだけなのかもしれないけど。

    public function onCreationCompleteHandler(event:FlexEvent):void {
        trace("onCreationCompleteHandler"+event);
    }

    public function onInitializeHandler(event:FlexEvent):void {
        trace("onInitializeHandler"+event);
    }

いやまぁ、AssembleComplete と ApplicationStart があるから困らないんだけどさ。ただ、onMouseMoveHandler で MouseEvent は拾える。というわけで、少なくとも xxxView そのものに対するイベントが拾えない、というわけでは無い。うーん……完了系のイベントは殺してる、とか?

というわけで。ちょっと yui-frameworks の中身を見てみる。結論から先に書いておくと「よくわかんね」です、すいません。


まず org.seasar.akabana.yui.framework.event.FrameworkEvent を見てみる。どーやら、少なくとも yui-frameworks 独自のイベントは 2 つあるようだ、てことが読み取れる。

    public class FrameworkEvent extends Event
    {
        public static const ASSEMBLE_COMPELETE:String = "assembleComplete";
        
        public static const APPLICATION_START:String = "applicationStart";
        //以下省略

じゃあとりあえず FrameworkEvent.ASSEMBLE_COMPELETE と FrameworkEvent.APPLICATION_START 使ってるとこでも見ましょうか、ということで。org.seasar.akabana.yui.framework.core.YuiFrameworkContainer を覗いてみる。

省略しまくってますが……とりあえず、AssembleComplete の後に ApplicationStart が出てるな、ってことが分かるなぁ、と。

public class YuiFrameworkContainer {
    //省略
    protected var _callTimer:Timer = new Timer(100,1);
    //省略

    public function initialize():void{
        //省略
        processAssembleView(key,view);
        //省略
        _callTimer.addEventListener(TimerEvent.TIMER,callApplicationStart,false,0,true);
        _callTimer.start();
    }

    //省略

    private function callApplicationStart( event:TimerEvent ):void{
        //省略
        view.dispatchEvent( new FrameworkEvent(FrameworkEvent.APPLICATION_START));
        //省略
    }

    //省略

    protected function processAssembleView( viewName:String, container:Container ):void{
        container.dispatchEvent( new FrameworkEvent(FrameworkEvent.ASSEMBLE_COMPELETE));
    }
}

ここまでで力尽きたので終了。