组件的事件

一、从简单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>

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值