关于Flex 初始化的research_Flex

后来研究发现,不是取不到,而是在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 中使用自定义对象变量的时候必须要注意,否则就会出现空指针之类的问题了。

时间: 2024-10-23 05:29:46

关于Flex 初始化的research_Flex的相关文章

flex 4-Flex初始化组件只能执行一次creationcomplete

问题描述 Flex初始化组件只能执行一次creationcomplete 在flex的开发中,我设计的是双击界面上的一个组件然后弹出一个窗口显示该组件的信息,该组件的信息是从数据库中读取出来的,我把读出数据库数据的事件函数放在creationcomplete里面,第一次打开初始化组件的时候可以获取到组件的详细信息,但是关闭该组件后重新打开不能在调用creationcomplete事件函数来重新读取数据库的数据,有没有其他的方法可以每次打开该组件后都重新读取数据库,把组件的详细信息显示在打开的组件

Flex AIR Mobile应用性能解决方案

这个flex  mobile开发,一般原生开发也许是最合适的方式,但是涉及到跨平台的问题,有精力的团队一般都会逐个基于移动操作系统进行开发.但是如果追求短小,精悍,快速,希望能够跨平台,基于html5或者Flex开发是一个不错的选择. Flex是个双刃剑,用的好的,做出来的效果不比原生差,做的不好的,效果.性能则不敢恭维,关于如何使用Flex开发出性能较高的应用,通过验证后得以收纳如下:   1.组件尽量使用为移动开发优化的(Spark组件),皮肤尽量使用简洁的,一般最好通过graphic以及f

Flex Data Binding详解

Data BindIng简单的说就是当绑定源属性发生变化时,Flex 会把绑定源变化后属性的值赋给目的物的属性.做到了数据同步. Data BindIng 什么时候发生: 1.在绑定源属性值发生改变时发生. 2.在绑定源发出initialize事件时绑定发生一次. 让属性具有可绑定功能: 一般的,只要在属性前加上 [Bindable] 或 [Bindable(event="eventname")] 元标记即可 注意: 如果没有标出触发绑定的事件,正如[Bindable],Flex会自动

Flex Quick Starts中文翻译(三)

中文 Adobe Flex应用程序是事件驱动的.当用户与界面组件交互时事件会通知程序员,当一个组件的外观或者生命周期发生重要改变,比如创建或者销毁一个容器,或改 变一个容器的大小的时候,事件也会通知程序员. 当一个组件的实例分派一个事件时,你为那个事件注册的监听器对象就会被通知. 你可以在 ActionScript 中定义事件监听器(或者叫做事件处理器)来处理事件.你 既可以在 MXML 声明中为一个组件注册事件监听器,也可以在 ActionScript 中实现 相同的功能. 接收事件通知有三种

Flex与.NET互操作(五):使用FileReference+HttpHandler实现文件上传/下载

在Flex的应用开发中,同ASP.NET,JSP,PHP等应用一样,都会有上传/下载文件的应用需求,Flex的SDK也为我们提供了专门的类 FileRefUdderence实现文件上传/下载 .Flex只是作为一个客户端,要实现上传或下载必须得为其提供一个服务端来接受上传或下载的请求, 本文以ASP.NET中的HttpHandler作为文件上传的服务端来完成上传功能. OK,我们从Flex客户端开始,看看客户端是通过什么方式想 服务端发起请求.Flex客户端要完成文件上传下载都是通过FileRe

Flex tree基于数据库的数据源

最近在研究flex,关于flex tree基于数据库数据的网上的例子基本没有,大部分都是基 于xml的对xml的操作实现tree的改变,通过改变数据库数据实现tree的改变例子没有找到, 所以分享给大家一个例子: 我是用hessian实现flex端与java端通讯的 1.flex端代码 Java代码 <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http:

Flex PropertyGrid实现

PropertyGrid在界面设计工具中是比较常用的组件,在.NET的WinForm设计中, PropertyGrid作为内置的组件来实现对 button.label等组件的属性设置,不仅满足了设计 时的需要,还能够在运行时提供美观实用的帮助:但是Flex作为目前界面设计展现方向上的 主流技术,并没有提供该组件.为了弥补这一不足,本文将介绍并实现Flex PropertyGrid组 件模型. PropertyGrid模型可以分为两个部分,即行为模型和数据展现模型. 所谓的行为模型就是Proper

Flex程序开发心得小结

和Flash的开发环境相比,Flex提供的组件库确实很诱人,但由于功能太全面,导致程序的体积大,有时候使用不当,可能会影响程序运行效率. 在Flex的帮助手册中,有一个专门的章节讲了程序的优化,下面是我结合帮助作的几点小结: 1.避免容器的多级嵌套,减少相对尺寸.相对定位的使用. 在使用百分比来给容器内的元件定尺寸,一旦容器中的任何一个元件的位置和尺寸变化,都会引发容器对所有子级的重定位动作.如果嵌套的级别很深,这个计算量会很大. 2.尽量使用轻量级的容器 Canvas是体积最小的容器,它只支持

使用Flex和Bison更好地进行错误处理

尽管使用 Flex 和 Bison 生成程序非常简单,但是要让这些程序产生用户友 好的语法和语义错误消息却很困难.本文将介绍 Flex 和 Bison 的错误处理特 性,并展示如何使用它们,然后详细介绍它们的一些缺陷. 简介 正如 UNIX 开发人员所了解的那样,Flex 和 Bison 的功能非常强大,非 常适合开发词法和语法解析器,尤其是语言编译器和解释器.如果我们不熟悉它 们所实现的工具 -- 分别是 Lex 和 Yacc -- 可以参 考一下本文 参考资料 一节中有关 Flex 和 Bi