关于组件实例化的生命周期

来源:互联网 发布:linux内核启动参数显卡 编辑:程序博客网 时间:2024/05/01 21:01

     组件实例化生命周期描述了用组件类创建组件对象时所发生的一系列步骤.作为生命周期的一部分,Flex 自动调用组件的方法,发出事件,并使组件可见。
下面例子用ActionScript 创建一个Button 控件,并将其加入到容器之中:
//创建一个Box 容器。
var boxContainer:Box = new Box();
//设置Box 容器

//创建Button 控件。
var b:Button = new Button()
// 设置button 控件。
b.label = "Submit";
...
// 将Button 添加到 Box 容器中。
boxContainer.addChild(b);
下面的步骤显示了用代码创建一个Button 控件,并将这个控件添加到Box 容器中时所发生的一切:
1. 调用了组件的构造函数,如下面代码所示:
// Create a Button control.
var b:Button = new Button()
2. 通过设置组件的属性对组件进行了设置,如下面代码所示:
// Configure the button control.
b.label = "Submit";
组件的setter 方法将会调用invalidateProperties(), invalidateSize(), 或者
invalidateDisplayList() 方法.
3. 调用addChild()方法将该组件添加到父组件中,如下代码所示:
// Add the Button control to the Box container.
boxContainer.addChild(b);
Flex 执行以下动作:
4. 将component 的parent 属性设置为对父容器的引用.
5. 计算组件的样式(style) 设置.
6. 在组件上分发preinitialize 事件.
7. 调用组件的createChildren() 方法.
8. 调用invalidateProperties(), invalidateSize()和invalidateDisplayList()方法以触发后续到来的,下一
个“渲染事件”(render event)期间对commitProperties(), measure(),或 updateDisplayList()方
法的调用。
这个规则唯一一个例外就是当用户设置组件的height 和width 属性时, Flex 不会调用
measure() 方法.
9. 在组件上分发initialize 事件。此时,组件所有的子组件都被初始化,但是组件没有改更
size 和处理布局。可以利用这个事件在组件布局之前执行一些附加的处理。
10. 在父容器上分发childAdd 事件.
11. 在父容器上分发initialize 事件.
12. 在下一个“渲染事件”(render event)中, Flex 执行以下动作:
a. 调用组件的commitProperties()方法.
b. 调用组件的 measure()方法.
c. 调用组件的 layoutChrome()方法.
d. 调用组件的updateDisplayList()方法.
e. 在组件上分发updateComplete 事件.
13. 如果commitProperties(), measure()或者updateDisplayList()方法调用了invalidateProperties(),
invalidateSize(),或invalidateDisplayList()方法,则Flexh 会分发另外一个render 事件.
14. 在最后的render 事件发生后, Flex 执行以下动作:
a. 通过设置组件的visible 属性使组件变为可视.
b. 在组件上分发creationComplete 事件.组件的大小(size)和布局被确定.
这个事件只在组件创建时分发一次.
c. 在组件上分发updateComplete 事件.无论什么时候,只要组件的布局
(layout),位置,大小或其它可视的属性发生变化就会分发这事件,然后组件被
更新,以使组件能够被正确地显示.
当使用addChild()方法将组件添加到容器中时,大部分工作都是为了设置这个组件.这是
因为直到把组件添加到容器中时,Flex 才能确定它的大小(size),设置它所继承样式(style)属
性,或者在屏幕上画出它.
也可以用MXML,在应用中完成上面的组件添加动作,如下面的例子所示:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Box>
<mx:Button label="Submit"/>
</mx:Box>
</mx:Application>
在MXML 中创建组件时,Flex 执行的步骤顺序同用ActionScript 的步骤顺序相同.
使用removeChild() 方法可将组件从容器中移出,如果对这个组件再没有其他的引用,那就
相当于使用Adobe® Flash® Player 或Adobe® AIR™的垃圾回收机制将组件从内存中删除.