(转载)
内部 类 指的是在一个 类 的内部在声明一个 类 的定 义 ,只 种 情况在 java 中是非常常 见 的 现 象,有的 时 候, 这种 用法用起来非常的方便。但是当你再在 ActionScript 类 中,定 义 一个内部 类 的 时 候,就会提示 编译错误 : “ 类 的定 义 不能 够 嵌套 ” 。 这 就郁 闷 了,莫非真的就不能 实现 了 吗 ?有一 种 方法可回避 这 个 问题 。
ActionScript 类 有两 种 形式,一 种 是 扩 展名 为 as 的, 这种类 的写法和 java 非常相似。另外一 种 是以 mxml 为扩 展名的文件, 这种类 是以 xml 文件格式 书 写的 类 ,其中也可以嵌套 as 代 码 。两 种 文件在 Flex 中的作用是相同的都代表一个 类 。在 as 代 码 中定 义 内部 类 是行不通的,前面已 经说 明了。只好把眼光放到 mxml 类 型的 类 中了。在 xmxl 的 标签 中, flex 提供了一个 <mx:Component> 标签 , 这种标签 只适用于 mxml 文件中,用来内 联 渲染器,多用于 DataGrild 控件用来功能 扩 展。 <mx:Component> 标签 有两个属性 id 和 className , id 属性属性可以指定一个内嵌 组 件 标识 符,以便您可以使用作 为 数据 绑 定 时 数据源的表达式。 className 属性指定内嵌 组 件的 类 名称,也就是相当于内部 类 的 类 名了。 这 就好 办 了,既然 AS 类 中不可以有内部 类 ,但是 mxml 类 中可以嵌入 组 件, 组 件也是 类 那就是内部 类 了。
接下来就可以 这样这样 做,定 义 一个 mxml 组 件, 该组 件可以 继 承与任意一个可 视组 件。例如可以 继 承于 Canvas 类 , 创 建完 毕 加入 <mx:Component> 标签 ,代 码 如下所示:
- <? xml version = "1.0" encoding = "utf-8" ?>
- < mx:Canvas xmlns:mx = "http://www.adobe.com/2006/mxml" width = "400" height = "300" >
- < mx:Component >
- < mx:HBox >
- < mx:TextInput width = "200" />
- < mx:Button label = "OK" />
- </ mx:HBox >
- </ mx:Component >
- </ mx:Canvas >
我们声明了一个内嵌组件,这个组件继承与 VBox 类,在这个组件中还添加了一个文本框和一个按钮。这个内嵌组件可以有自己的 AS 代码这些代码和外部类的代码是没有冲突的。如下所示:
- <?xml version= "1.0" encoding= "utf-8" ?>
- <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width= "400" height= "300" >
- <mx:Component className="MyInput" >
- <mx:HBox>
- <mx:Script>
- <!--[CDATA[
- import mx.managers.PopUpManager;
- public var text:String = "test property" ;
- private function onClick(): void
- {
- text = txt.text;
- PopUpManager.removePopUp(this );
- }
- ]]>
- </mx:Script>
- <mx:TextInput id="txt" width= "200" />
- <mx:Button label="OK" click= "onClick()" />
- </mx:HBox>
- </mx:Component>
- <mx:Script>
- <![CDATA[
- import mx.managers.PopUpManager;
- import mx.core.Application;
- import mx.core.UIComponent;
- private var mi:MyInput = null ;
- private function onClick(): void
- {
- mi = PopUpManager.createPopUp(UIComponent(Application.application),MyInput,true ) as MyInput;
- PopUpManager.centerPopUp(mi);
- lb.text = mi.text;
- }
- ]]-->
- </mx:Script>
- <mx:Button label="show popup" click= "onClick()" />
- <mx:Label id="lb" width= "353" y= "30" height= "27" />
- </mx:Canvas>
在上面这个例子中,内嵌组件完全可以当成是一个内部类来使用,可以创建对象,可以访问该对象的方法和属性。当使用内部类的时候需要注意以下几点:
1 、内嵌组件有一个关键字“ outerDocument
”用来访问外部类的公共属性和方法,但是仅限于内嵌组件用于 item renderer 或者 item editor 的时候。以上这种用法,是不可以使用 outerDocument
关键字的。
2 、在写内嵌组件的时候, FlexBuilder 很有可能没有语法提示,没关系,只要按照上面例子的格式,不用理它继续写就可以了。
3 、这是我遇到的一个问题,内嵌控件最好定义在文件的上部,当外部控件的 AS 代码写得多了以后,可能会出现找不到内嵌控件这个类的编译错误。这个确实很奇怪,注意一下就可以了。