Flex自定义事件

 

 对于自定义组件,我们通常希望能够把它写的通用一些,比如一个自定义的按钮,在A处调用,我们希望它能弹出一个窗口,而在B处调用,我们希望它能够发送请 求到后台服务等。我们希望在调用自定义组件的地方能够定制这些功能,这就需要使用自定义事件把自定义组件和调用程序关联起来。

 

下面我们就来看一下,如何实现这样的功能,有两种方法:

第一种:

自定义组件myButton的代码:

 

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
   xmlns:s="library://ns.adobe.com/flex/spark"
   xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">
 <fx:Script>
  <![CDATA[
   private function onClick(event:MouseEvent):void{
    dispatchEvent(new Event("customClick"));
   }
  ]]>
 </fx:Script>
 <s:Button label="click me" click="onClick(event)" />
</s:Group>

*点击自定义组件中的按钮时,创建一个Event对象,在构造函数中添加自定义的事件类型,然后使用dispatchEvent方法发送。在主窗体中对该组件添加事件监听。

 

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
      xmlns:s="library://ns.adobe.com/flex/spark"
      xmlns:mx="library://ns.adobe.com/flex/mx" 
      xmlns:components="com.fgj.components.*"
      creationComplete="init()">
 <fx:Script>
  <![CDATA[
    private function init():void{
    myBtn.addEventListener("customClick", onClickHandler);
   }   
   private function onClickHandler(event:Event):void{
    trace("123");
   }
  ]]>
 </fx:Script>
  <components:MyButton id="myBtn"/>
</s:Application>

 *主窗体中对该组件监听类型为customClick的事件。通过这种方式就把两个文件关联起来了。

 

如果要由自定义组件向主窗体传递参数,可以创建一个事件对象,将参数赋值给该对象的属性进行传递。

自定义事件:

 

public class MyEvent extends Event
 {
  public var param:String = ""; 
  public function MyEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
  {
   super(type, bubbles, cancelable);
  }
 }

 

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
   xmlns:s="library://ns.adobe.com/flex/spark"
   xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">
 <fx:Script>
  <![CDATA[
   import com.fgj.events.MyEvent;
   
   private function onClick(event:MouseEvent):void{
    var e:MyEvent = new MyEvent("passParam");
    e.param = "abc";
    this.dispatchEvent(e);
   }
  ]]>
 </fx:Script>
 <fx:Declarations>
  <!-- Place non-visual elements (e.g., services, value objects) here -->
 </fx:Declarations>
 <s:Button label="Click" click="onClick(event)" />
</s:Group>

 

 

customBtn.addEventListener("passParam", onClick);
private function onClick(event:MyEvent):void{
 trace(event.param);
}

<components:CustomEventComp id="customBtn" />
 

 

 

第二种(标签式监听):

这里需要用到元数据标签,这是一种特殊的标签,它在代码中的作用是像编译器提供如何编译程序的信息。实际上,这些标签并没有被编译进swf文件中,而只是告诉编译器如何生成swf文件。

Flex为事件定义了[Event]元标签,用来声明那些被自定义类派发的事件。

 

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
   xmlns:s="library://ns.adobe.com/flex/spark"
   xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">
 <fx:Metadata>
  [Event(name="customClick", type="flash.events.Event")]
 </fx:Metadata>
 <fx:Script>
  <![CDATA[
   private function onClick(event:MouseEvent):void{
    dispatchEvent(new Event("customClick"));
   }
  ]]>
 </fx:Script>

 <s:Button label="click me" click="onClick(event)" />
</s:Group>

 

 

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
      xmlns:s="library://ns.adobe.com/flex/spark"
      xmlns:mx="library://ns.adobe.com/flex/mx" 
      xmlns:components="com.fgj.components.*">      
 <fx:Script>
  <![CDATA[
   private function onClickHandler(event:Event):void{
    trace("123");
   }
  ]]>
 </fx:Script>
 <components:MyButton id="myBtn" customClick="onClickHandler(event)" />
</s:Application>

   个人比较推荐第二种做法,因为动态添加事件监听器(addEventListener),会使程序的可读性变差。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值