Flex: mx_internal
在阅读Flex源代码的时候,我们经常可以见到某些property或者function的作用域为mx_internal
。根据Adobe的说法,mx_internal
是用来标记Flex框架内部property和function的;在没有特殊声明的情况下,被标记的property和function不会暴露给Flex的使用者。那么,我们如何来使用mx_internal呢?CodeOfDoom上有一篇文章对此进行了详细的解释。
原文: http://codeofdoom.com/wordpress/2009/03/12/when-and-how-to-use-mx_internal-in-flex/
如何使用mx_internal?
使用mx_internal
有两种方式,一种是导入mx_internal
命名空间:
import mx.core.mx_internal;
use namespace mx_internal;
导入命名空间后,Flex代码就可以使用所有作用域为mx_internal
的property和function。在使用到这些property和function的地方,最好进行一下注释以标明这是mx_internal的变量 — 这样做有利于代码维护。
另一种方式是在使用到某个mx_internal
变量的时候,才具体声明一下:
object.mx_internal::inputField.restrict;
原文作者认为第二种方式更好,因为这样可以在代码层面显式声明使用的变量中哪些是mx_internal的,哪些不是。
使用mx_internal有什么好处?
好处是显而易见的 — 编写代码的时候可以访问更多的property和function。比如,当我们在IDE中输入panel对象后,IDE将提示所有可用的property和function:
在声明use namespace mx_internal
之后,我们可以得到更多的选择:
mx_internal示例
我们可以用”自定义NumericStepper组件”来举例说明mx_internal
的使用。
mx:NumericStepper
组件由一个文本输入框和两个按钮组成,用户可以在文本输入框中输入任意数值,也可以点击步进按钮来改变数值。如果我们想要禁止用户在文本输入框中直接输入数值该怎么办呢?有了mx_internal
,我们可以这么做:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" creationComplete="complete()" >
<mx:Script>
<![CDATA[
public function complete():void{
stepper.mx_internal::inputField.editable = false;
}
]]>;
</mx:Script>
<mx:HBox id="hbox">
<mx:NumericStepper id="stepper" />
</mx:HBox>
</mx:Application>
如果我们还想改变NumericStepper中按钮的行为,我们可以这么做:
[Bindable]
[Embed(source='../red.png')]
private var redIcon:Class;
public function complete():void{
stepper.mx_internal::inputField.editable = false;
stepper.mx_internal::nextButton.setStyle("icon",redIcon);
stepper.mx_internal::prevButton.setStyle("icon",redIcon);
}
效果为:
谨慎使用mx_internal
使用mx_internal
会有什么问题吗?答案是肯定的。使用mx_internal
必须非常小心。
问题一:所有作用域为mx_internal
的property和function都不会出现在Flex SDK的文档中 — mx_internal
被设计为仅在Flex框架内部使用。因此,只能通过阅读Flex源代码来寻找合适的mx_internal变量。
问题二:因为mx_internal
被设计为仅在框架内部使用,因此在不同版本的Flex中无法保证兼容性 — 随着Flash Player的升级,当前使用的mx_internal
变量有可能会被删除,或者赋予不同的含义。