読者です 読者をやめる 読者になる 読者になる

tohokuaikiのチラシの裏

技術的ネタとか。

Confluenceのプラグイン開発を承ります。ご連絡はこちらのホームページからお願いいたします。

mxmlのcreationCompleteの微妙なタイミング

flex

ポップアップウインドウを作りたいときとか。

PopupWindow.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml"
 creationComplete="init()">
<mx:Script>
<![CDATA[
    private var buttonFlags:uint = 0x4;
    
    private var type:uint;
    
    public static function popup(flags:uint = 0x4 /* Alert.OK */,
                               type: uint = 0x0016 /* ALERT */ ,
                               parent:Sprite = null,
                               cb:Function = null):void
    {
        var win:PopupWindow = new PopupWindow();
        trace("------------------------------------");
        win.type = type;
        win.buttonFlags = flags;
        
        PopUpManager.addPopUp(win, parent, false);
        PopUpManager.centerPopUp(win);
        
    }

    ///////////////////////////////////////////////////////////////////////////

    private function init():void
    {
        trace("++++++++++++++++++++++++++++++++++");
    }

]]>
</mx:Script>
</mx:Panel>

とかして、コールしたいボタンから

PopupWindow.popup(ALERT.OK);

みたいにするんだけど、てっきり
trace("++++++++++++++++++++++++++++++++++");
trace("------------------------------------");
の順で出るんだろうと思ってたら、逆だった。


えー、PopupWindowがnewされた時点でcreationCompleteイベントが走るんじゃないんだ。

マニュアルには

コンポーネントの構築、プロパティ処理、測定、レイアウト、および描画が完了したときに送出されます。

って書いてある。

あー、newされた時点では描画は完成されてない。mxmlのDOMとして認識されてない。


init()が走るのは、PopUpManager.addPopUp(win, parent, false);した時点だ。

だから、newしたあとに、プロパティに値を突っ込んでやって、creationCompleteでその値でゴニョゴニョできるわけ。

これは確かにそれが使いやすい。