Flex 自定义事件
一.分派自定义事件类型
任何实现flash.event.IEventDispatcher接口的对象都可以分派事件,这包括所有显示对象和一些非显示对象类。通常,对于
自定义的非显示类,可以通过扩展flash.event.EventDispatcher实现分派事件的功能。
代码:dispatcherEvent(new Event("Complete"));
这行代码执行两个操作:
* 实例化一个新事件类来处理和保存信息
* 使用dispatcherEvent()函数调用来分派“Complete”类型的事件
二.创建自定义事件
下面将创建一个简单的实例,添加事件分派到自定义的非显示组件中。程序加载一个XML文件,然后在一个List中显示出结果。
首先创建一个名为DataLoader的新as类,这个类处理数据的加载和分析工作。
package net { import event.ContentEvent; import flash.events.ErrorEvent; import flash.events.Event; import flash.events.EventDispatcher; import flash.events.IOErrorEvent; import flash.events.SecurityErrorEvent; import flash.net.URLLoader; import flash.net.URLRequest; import mx.collections.ArrayCollection; public class DataLoader extends EventDispatcher //扩展EventDispatcher类 { protected var _loader:URLLoader; public function DataLoader() { super(); _loader=new URLLoader(); _loader.addEventListener(Event.COMPLETE,onComplete); _loader.addEventListener(IOErrorEvent.IO_ERROR,onError); _loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onError); } public function load(url:String):void { _loader.load(new URLRequest(url)); } public function onComplete(event:Event):void { var users:ArrayCollection=new ArrayCollection(); for each(var user:XML in XML(_loader.data).user) { users.addItem(user.@name+"-"+user.@site); } var ev:ContentEvent=new ContentEvent(ContentEvent.DATA_BACK);//创建并分派自定义完成事件 ev.users=users; dispatchEvent(ev); } public function onError(event:Event):void { var ev:ContentEvent=new ContentEvent(ContentEvent.DATA_ERROR);//创建并分派自定义错误事件 ev.error=event.text; dispatchEvent(ev); } } }
创建自定义事件
package event { import flash.events.Event; import mx.collections.ArrayCollection; public class ContentEvent extends Event { public static const DATA_BACK:String="databack"; public static const DATA_ERROR:String="dataError"; public var users:ArrayCollection; public var error:String; public function ContentEvent(type:String,bubbles:Boolean=false,cancelable:Boolean=false) { super(type,bubbles,cancelable); } override public function clone():Event { var event:ContentEvent=new ContentEvent(type,bubbles,cancelable); event.users=users; event.error=error; return event; } } }
MXML应用程序
<?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="init()"> <fx:Script> <![CDATA[ import event.ContentEvent; import flash.text.engine.ContentElement; import mx.controls.Alert; import net.DataLoader; protected function init():void { var dataLoader:DataLoader=new DataLoader(); dataLoader.addEventListener(ContentEvent.DATA_BACK,onData); dataLoader.addEventListener(ContentEvent.DATA_ERROR,onError); dataLoader.load("content.xml"); } protected function onData(event:ContentEvent):void { userList.dataProvider=event.users; } protected function onError(event:ContentEvent):void { Alert.show(event.error,"ERROR!"); } ]]> </fx:Script> <s:List id="userList" width="100" height="100"/> </s:Application>