一、从简单MXML组件中处理事件
简单MXML组件是那些包含一个单独的,不是一个容器的的根标签。下面的主题StateComboBox.mxml组件就是一个简单组件,因为它
仅是为ComboBox控件的一个定义。
对于处理一个简单组件中的事件你有两个选择:在你的定制组件内部处理,或使用这个组件的文件中处理
例,在外部处理组件的close事件:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:MyComp="*">
<mx:Script>
<![CDATA[
import flash.events.Event;
public function handleCloseEvent(eventObj:Event):void {
...
}
]]>
</mx:Script>
<MyComp:StateComboBox rowCount="5" close="handleCloseEvent(event);"/>
</mx:Application>
例二,在组件内处理
<?xml version="1.0"?>
<!-- StateComboBox.mxml -->
<mx:ComboBox xmlns:mx="http://www.adobe.com/2006/mxml"close="handleCloseEvent(event);">
<mx:Script>
<![CDATA[
import flash.events.Event;
public function handleCloseEvent(eventObj:Event):void {
...
}
]]>
</mx:Script>
<mx:dataProvider>
<mx:String>AK</mx:String>
<mx:String>AL</mx:String>
</mx:dataProvider>
</mx:ComboBox>
对于一个简单MXML组件,你可同时在以上两处定义事件侦听器,两个侦听器都将处理事件,然而,定义在组件内部的事件侦听器先
于在外的执行。
二、创建定制事件
所有的MXML组件能分发事件,包括继承于它们超类的,或是你在组件中定义的。在后例中,这个自定义组件定义了一个新的成员属
性叫enableTA,在它的setter方法中分发一个新的事件类型,叫作enableChanged。使用[Event]元数据标签标识这个事件类型给
MXML编译器,让引用这个组件的文件能使用这个事件名。元数据标签的格式为:
<mx:Metadata>
[Event(name="eventName", type="eventType")]
</mx:Metadata>
下面是自定义组件的代码,声明了新的事件类型,并在setter方法里派发这个事件:
<?xml version="1.0"?>
<!-- mxmlAdvanced/myComponents/TextAreaEnabled.mxml -->
<mx:TextArea xmlns:mx="http://www.adobe.com/2006/mxml" >
<mx:Metadata>
[Event(name="enableChanged", type="flash.events.Event")]
</mx:Metadata>
<mx:Script>
<![CDATA[
import flash.events.Event;
// Define private variable to hold the enabled state.
private var __enableTA:Boolean;
// Define a setter method for the private variable.
public function set enableTA(val:Boolean):void {
__enableTA = val;
enabled = val;
// Define event object, initialize it, then dispatch it.
dispatchEvent(new Event("enableChanged"));
}
// Define a getter method for the private variable.
public function get enableTA():Boolean {
return __enableTA;
}
]]>
</mx:Script>
</mx:TextArea>
下边的主应用的代码,为这个组件的新事件定义了一个侦听器:
<?xml version="1.0"?>
<!-- mxmlAdvanced/MainTextAreaEnable.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:MyComp="myComponents.*">
<mx:Script>
<![CDATA[
import flash.events.Event;
import myComponents.TextAreaEnabled;
public function handleEnableChangeEvent(eventObj:Event):void {
var tempTA:TextAreaEnabled =
eventObj.currentTarget as TextAreaEnabled;
if (tempTA.enableTA) {
myButton.label="Click to disable";
}
else {
myButton.label="Click to enable";
}
}
]]>
</mx:Script>
<MyComp:TextAreaEnabled id="myTA" enableTA="false"
enableChanged="handleEnableChangeEvent(event);" />
<mx:Button id="myButton" label="Click to enable"
click="myTA.enableTA=!myTA.enableTA;" />
</mx:Application>
如果你在定制组件中不使用[Event]元数据标签来定义enableChanged事件,当你在一个MXML文件中引用这个事件名时,MXML编译器
将会产生一个错误信息。在ActionScript中使用addEventListener()方法为事件注册一个事件侦听器,即使你省略了[Event]元数据
标签。
你也可创建事件类型,包含新的属性,让你可以传递这些属性回给引用的文件,要这么做,你创建一个Event类的子类。
三、为复合组件处理事件
复合组件使用一个容器作为根标签,并在容器里定义子组件。对于根容器产生的事件,象在简单MXML组件一样来处理,在组件中或
是组件的引用文件里进行处理。
要操纵处理根容器的子对象分发的事件,在MXML组件内部,你可象对根容器分发的事件一样的来处理它。但你想让子对象分发事件
到引用文件中,你必须增加一些逻辑来繁殖传播这个事件。
下例的自定义组件中,为组件中的ComboBox子控件的close事件,创建一个侦听器方法来重分发这个事件:
<?xml version="1.0"?>
<!-- mxmlAdvanced/myComponents/AddressForm.mxml -->
<mx:Form xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:local="*">
<mx:Metadata>
[Event(name="close", type="flash.events.Event")]
</mx:Metadata>
<mx:Script>
<![CDATA[
import flash.events.Event;
// Redispatch event.
private function handleCloseEventInternal(eventObj:Event):void {
dispatchEvent(eventObj);
}
]]>
</mx:Script>
<mx:FormItem label="Name">
<mx:TextInput id="name1" />
</mx:FormItem>
<mx:FormItem label="Street">
<mx:TextInput id="street" />
</mx:FormItem>
<mx:FormItem label="City" >
<mx:TextInput id="city" />
</mx:FormItem>
<mx:FormItem label="State" >
<mx:ComboBox close="handleCloseEventInternal(event);">
<mx:dataProvider>
<mx:Array>
<mx:String>AK</mx:String>
<mx:String>AL</mx:String>
</mx:Array>
</mx:dataProvider>
</mx:ComboBox>
</mx:FormItem>
</mx:Form>
当然,你也可不声明这个新事件,而为其专门创建一个新的事件类型用来传播。
下面是调用的文件中处理这个事件:
<?xml version="1.0"?>
<!-- mxmlAdvanced/MainAddressFormHandleEvent.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:MyComp="myComponents.*">
<mx:Script>
<![CDATA[
import flash.events.Event;
private function handleCloseEvent(eventObj:Event):void {
myTAClose.text=eventObj.type;
}
private function handleMouseDown(eventObj:Event):void {
myTA.text=eventObj.type;
}
]]>
</mx:Script>
<mx:TextArea id="myTA" />
<mx:TextArea id="myTAClose" />
<MyComp:AddressForm mouseDown="handleMouseDown(event);"
close="handleCloseEvent(event);"/>
</mx:Application>