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>

  

posted @ 2013-10-16 11:11  Mars、少年  阅读(493)  评论(0编辑  收藏  举报