• 分类

  • 重置

关于Flex 初始化的research

    后来研究发现,不是取不到,而是在createChildren的时候,自定义的objcet还没有被赋值,只有当该组件的init事件之后才会被赋值,代码如下:
    APP:

    复制代码 代码如下:

    <?xml version=”1.0″ encoding=”utf-8″?>
    <mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml”
        layout=”absolute” xmlns:com=”com.*”>
        <mx:Script>
            <!–[CDATA[
                [Bindable]
                private var o:Object = {};
            ]]–>
        </mx:Script>
        <com:CustomPanel width=”100%” height=”100%” label=”FlexInitResearch”>
            <com:CustomButton label=”Button”
                customString=”customString test” customObject=”{o}”/>
        </com:CustomPanel>
    </mx:Application>


    CustomPanel:

    复制代码 代码如下:

    package com
    {
        import mx.containers.Panel;
        import mx.events.FlexEvent;

        public class CustomPanel extends Panel
        {
            public function CustomPanel()
            {
                super();
                this.addEventListener(FlexEvent.PREINITIALIZE,             onPreInit);
                this.addEventListener(FlexEvent.INITIALIZE,             onInit);
                this.addEventListener(FlexEvent.CREATION_COMPLETE,         onCreationComplete);
                this.addEventListener(FlexEvent.APPLICATION_COMPLETE,     onAppInitComplete);
            }

            //=================================
            // event handler
            //=================================

            private function onPreInit(event:FlexEvent):void
            {
                trace(“CustomPanel[ PreInit ]”);
            }

            private function onInit(event:FlexEvent):void
            {
                trace(“CustomPanel[ Init ]”);
            }

            private function onCreationComplete(event:FlexEvent):void
            {
                trace(“CustomPanel[ CreationComplete ]”);
            }

            private function onAppInitComplete(event:FlexEvent):void
            {
                trace(“CustomPanel[ AppInitComplete ]”);
            }

            //=================================
            // override function
            //=================================

            override protected function createChildren():void
            {
                trace(“CustomPanel[ Begin to createChildren ]”);
                super.createChildren();
                trace(“CustomPanel[ The end of createChildren ]”);
            }

            override protected function measure():void
            {
                trace(“CustomPanel[ Begin to measure ]”);
                super.measure();
                trace(“CustomPanel[ The end of measure ]”);
            }

            override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
            {
                trace(“CustomPanel[ Begin to updateDisplayList ]”);
                super.updateDisplayList(unscaledWidth, unscaledHeight);
                trace(“CustomPanel[ The end of updateDisplayList ]”);
            }

            override protected function layoutChrome(unscaledWidth:Number, unscaledHeight:Number):void
            {
                trace(“CustomPanel[ Begin to layoutChrome ]”);
                super.layoutChrome(unscaledWidth, unscaledHeight);
                trace(“CustomPanel[ The end of layoutChrome ]”);
            }

            override protected function commitProperties():void
            {
                trace(“CustomButton[ Begin to commitProperties ]”);
                super.commitProperties();
                trace(“CustomButton[ The end of commitProperties ]”);
            }
        }
    }


    CustomButton:

    复制代码 代码如下:

    package com
    {
        import mx.controls.Button;
        import mx.events.FlexEvent;

        public class CustomButton extends Button
        {
            //=================================
            // properties
            //=================================
            private var _customString:String     = “”;
            private var _customObject:Object     = null;

            public function get customString():String
            {
                return _customString;
            }
            //string
            public function set customString(value:String):void
            {
                trace(“CustomButton( set customString )”);
                _customString = value;
            }

            //object
            public function get customObject():Object
            {
                return _customObject;
            }

            public function set customObject(value:Object):void
            {
                trace(“CustomButton( set customObject )”);
                _customObject = value;
            }

            //=================================
            // Constructor
            //=================================

            public function CustomButton()
            {
                trace(“CustomButton( Begin to Constructor )”);
                super();
                this.addEventListener(FlexEvent.PREINITIALIZE,             onPreInit);
                this.addEventListener(FlexEvent.INITIALIZE,             onInit);
                this.addEventListener(FlexEvent.CREATION_COMPLETE,         onCreationComplete);
                this.addEventListener(FlexEvent.APPLICATION_COMPLETE,     onAppInitComplete);
                trace(“CustomButton( The end of Constructor )”);
            }

            //=================================
            // event handler
            //=================================

            private function onPreInit(event:FlexEvent):void
            {
                trace(“CustomButton( PreInit )”);
            }

            private function onInit(event:FlexEvent):void
            {
                trace(“CustomButton( Init )”);
            }

            private function onCreationComplete(event:FlexEvent):void
            {
                trace(“CustomButton( Creation Complete )”);
            }

            private function onAppInitComplete(event:FlexEvent):void
            {
                trace(“CustomButton( AppInitComplete )”);
            }

            //=================================
            // override function
            //=================================

            override protected function createChildren():void
            {
                trace(“CustomButton( Begin to createChildren )”);
                super.createChildren();
                trace(“CustomButton( The end of createChildren )”);
            }

            override protected function measure():void
            {
                trace(“CustomButton( Begin to measure )”);
                super.measure();
                trace(“CustomButton( The end of measure )”);
            }

            override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
            {
                trace(“CustomButton( Begin to updateDisplayList )”);
                super.updateDisplayList(unscaledWidth, unscaledHeight);
                trace(“CustomButton( The end of updateDisplayList )”);
            }

            override protected function commitProperties():void
            {
                trace(“CustomButton( Begin to commitProperties )”);
                super.commitProperties();
                trace(“CustomButton( The end of commitProperties )”);
            }
        }
    }


    最后运行的结果是:
    CustomPanel[ PreInit ]
    CustomPanel[ Begin to createChildren ]
    CustomButton( Begin to Constructor )
    CustomButton( The end of Constructor )
    CustomButton( set customString ) //基本变量(String,Number(int,uint),Boolean)在PreInit 之前就被赋值
    CustomButton( PreInit )
    CustomButton( Begin to createChildren )
    CustomButton( The end of createChildren )
    CustomButton( Init )
    CustomButton( set customObject ) //自定义对象变量在 Init之后才能被赋值,所以在createChildren中取不到
    CustomPanel[ Init ] //有子控件的时候,Init 事件是在createChildren中发出的
    CustomPanel[ The end of createChildren ]
    CustomButton( set customObject )
    CustomButton[ Begin to commitProperties ]
    CustomButton[ The end of commitProperties ]
    CustomButton( Begin to commitProperties )
    CustomButton( The end of commitProperties )
    CustomButton( Begin to measure )
    CustomButton( The end of measure )
    CustomPanel[ Begin to measure ]
    CustomPanel[ The end of measure ]
    CustomPanel[ Begin to updateDisplayList ]
    CustomPanel[ Begin to layoutChrome ]
    CustomPanel[ The end of layoutChrome ] //证明layoutChrome是在updateDisplayList 中被调用的
    CustomPanel[ The end of updateDisplayList ]
    CustomButton( Begin to updateDisplayList )
    CustomButton( The end of updateDisplayList )
    CustomButton( Creation Complete )
    CustomPanel[ CreationComplete ]
    后来又发现,在MXML中设置基本变量和对象变量有一定区别,那就是对象变量必须要用大括号{}包起来,于是就想,会不会是绑定造成的,将APP改成如下,发现跟预想中的一样,最后的输出结果与上面的一样:

    复制代码 代码如下:

    <?xml version=”1.0″ encoding=”utf-8″?>
    <mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml”
        layout=”absolute” xmlns:com=”com.*”>
        <mx:Script>
            <!–[CDATA[
                [Bindable]
                private var o:String = “String test”;//将原对象换成字符串
            ]]–>
        </mx:Script>
        <com:CustomPanel width=”100%” height=”100%” label=”FlexInitResearch”>
            <com:CustomButton label=”Button”
                customString=”customString test” customObject=”{o}”/>
        </com:CustomPanel>
    </mx:Application>


    为了进一步确定是由于绑定造成的赋值时期不一致,我又做了如下的一个试验,不使用绑定给对象变量赋值:

    复制代码 代码如下:

    <?xml version=”1.0″ encoding=”utf-8″?>
    <mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml”
        layout=”absolute” xmlns:com=”com.*”>
        <com:CustomPanel width=”100%” height=”100%” label=”FlexInitResearch”>
            <com:CustomButton label=”Button”
                customString=”customString test”>
                <com:customObject>
                    <mx:ArrayCollection/>
                </com:customObject>
            </com:CustomButton>
        </com:CustomPanel>
    </mx:Application>


    其结果为:
    CustomPanel[ PreInit ]
    CustomPanel[ Begin to createChildren ]
    CustomButton( Begin to Constructor )
    CustomButton( The end of Constructor )
    CustomButton( set customString )
    CustomButton( set customObject ) //赋值时间与基本变量相同
    CustomButton( PreInit )
    CustomButton( Begin to createChildren )
    CustomButton( The end of createChildren )
    CustomButton( Init )
    CustomPanel[ Init ]
    CustomPanel[ The end of createChildren ]
    CustomButton[ Begin to commitProperties ]
    CustomButton[ The end of commitProperties ]
    CustomButton( Begin to commitProperties )
    CustomButton( The end of commitProperties )
    CustomButton( Begin to measure )
    CustomButton( The end of measure )
    CustomPanel[ Begin to measure ]
    CustomPanel[ The end of measure ]
    CustomPanel[ Begin to updateDisplayList ]
    CustomPanel[ Begin to layoutChrome ]
    CustomPanel[ The end of layoutChrome ]
    CustomPanel[ The end of updateDisplayList ]
    CustomButton( Begin to updateDisplayList )
    CustomButton( The end of updateDisplayList )
    CustomButton( Creation Complete )
    CustomPanel[ CreationComplete ]
    问题确定,所以以后再createChildren 中使用自定义对象变量的时候必须要注意,否则就会出现空指针之类的问题了。

发表评论

发表评论