在我们平时写代码时,大家讲求的就是低耦合。Flex的事件机制就是一种良好的解耦方案。有写过js的同仁会发现flex的事件机制其实跟js还是有一定的相似度的。
下面我们就看看怎么在Flex中自定义事件:
在flex中一个组件广播事件,需要使用dispatchEvent()方法。此方法定义在flash.events.EventDispatcher中,dispatchEvent()接受一个参数,即要分派的事件对象,分派事件后任何监听该事件的对象都能捕捉到该事件。dispatchEvent()方法接受一个flash.events.Event类的实例作为参数,所以自定义事件类必须继承于flash.events.Event类。同时需要注意的是在自定义事件是必须重写clone()方法(本人还不太了解各种缘由,有知道的人请@本人一下)。
小二上菜(示例代码):
package events
{
import flash.events.Event;
import valueObjects.Product;
public class ProductEvent extends Event
{
public var product:Product;
public function ProductEvent(type:String, product:Product)
{
super(type);
this.product = product;
}
override public function clone():Event
{
return new ProductEvent(type, product);
}
}
}
测试代码
<?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" minWidth="955" minHeight="600"
creationComplete="application_creationCompleteHandler(event)">
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
import events.UserAcknowledgeEvent;
protected function button1_clickHandler(event:MouseEvent):void
{
var e:UserAcknowledgeEvent = new UserAcknowledgeEvent("userCancel", new Date());
this.dispatchEvent(e);
}
protected function acceptHandler(event:UserAcknowledgeEvent):void
{
trace(event);
}
private function application_creationCompleteHandler(event:FlexEvent):void
{
this.addEventListener("userCancel", acceptHandler);
}
]]>
</fx:Script>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:layout>
<s:VerticalLayout/>
</s:layout>
<fx:Metadata>
[Event(name="userAccept", type="events.UserAcknowledgeEvent")]
[Event(name="userCancel", type="events.UserAcknowledgeEvent")]
</fx:Metadata>
<s:Button label="customEvent" click="button1_clickHandler(event)"/>
</s:Application>