`
蒙太奇
  • 浏览: 52203 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

改进ActionScript3的事件机制:事件桥EventBridge

    博客分类:
  • flex
阅读更多
     告示:本文为原创文章, 如果转载请注明出处!http://summerofthatyear-gmail-com.iteye.com/blog/328259
      在Flex应用中,由于actionscript3的事件机制是在显示对象一层层向上冒泡的,所以如果在比较复杂的页面结构的时候,你可能会被事件的一层层的冒泡搞的晕头转向.而且在底层派发事件,高层侦听事件,也是很麻烦的一件事情.
      有了"事件桥"这一切将不再是问题,事件桥的功能是它可以把一个事件从一个地方传到任意另外一个地方.不需要冒泡!因为他不通过显示对象的父子关系级级散发,而通过一个第三方类来跳转。这样即提高了性能又方便了用户。
      听不懂没关系, 举个例子就一目了然了.
      这个例子很简单, 是一个选择用户的模块, 就是一个TextArea和一个Button, 点击Button弹出一个TitleWindow(PopUpManager). TitleWindow有一个DataGrid, 然后在DataGrid里面选择一个用户返回;
      首先是一个用户对象:
package com.montage.vo
{
	/**
	 * @author Montage
	 */	
	public class User
	{
		public function User()
		{
		}
		
		public var name:String;
		public var country:String;

	}
}


选择完了用户, 所需要的事件
package com.montage.events
{
	import com.montage.vo.User;
	
	import flash.events.Event;

	/**
	 * @author Montage
	 */	
	public class UserEvent extends Event
	{
		public static var SELECTED_USER:String = "selectedUser";
		
		public var user:User;
		
		public function UserEvent(type:String,
								  bubbles:Boolean=false, 
								  cancelable:Boolean=false)
		{
			super(type, bubbles, cancelable);
		}
	}
}



下面就是“事件桥”,他似乎没有什么代码,就是一个单件类的架子,但是可别小看了它,由于它继承了EventDispatcher所以它可以做到听/发事件!
package com.montage.model
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	
	//////////////////////
	//
	// events
	//
	//////////////////////
	/**
	 * 给当前类注册一个事件
	 */	
	[Event(name="selectedUser", type="com.montage.events.UserEvent")]

	/**
	 * 
	 * @author Montage 
	 */	
	public class EventBridge extends EventDispatcher
	{
		
		private static var instance:EventMessage = null;
		
		public function EventMessage()
		{
			if( instance != null )
			{
				throw new Error("EventBridge是一个单件类,只能被实例化一次!");
			}
		}
		
		public static function getInstance():EventBridge
		{
			if( instance == null )
			{
				instance = new EventBridge();
			}
			return instance;
		}
	}
}


以下是用户列表界面UserList.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="400" height="300" title="选择用户">
	<mx:Script>
		<![CDATA[
			import mx.controls.Alert;
			import com.montage.events.UserEvent;
			import com.montage.vo.User;
			import com.montage.model.EventMessage;
			import mx.managers.PopUpManager;
			
			private var eventBridge:EventBridge = EventBridge.getInstance();
			
			private function submitHandler():void
			{
				if( grid.selectedIndex > -1 )
				{
					var item:XML = XML( grid.selectedItem );
					
					//创建一个用户
					var user:User = new User();
					user.name = item.@name;
					user.country = item.@country;
					
					//创建一个UserEvent事件, 把刚刚创建好的user赋给它
					var event:UserEvent = new UserEvent( UserEvent.SELECTED_USER );
					event.user = user;
					
					//用EventBridge将这个事件发送出去
					eventBridge.dispatch( event );
					cancelHandler();
				}
				else
				{
					Alert.show("请选择一个用户!");
				}
			}
			
			private function cancelHandler():void
			{
				PopUpManager.removePopUp( this );
			}
		]]>
	</mx:Script>
	<mx:XML id="users" source="user.xml"/>
	<mx:DataGrid id="grid" width="100%" height="100%" dataProvider="{users.User}">
		<mx:columns>
			<mx:DataGridColumn headerText="姓名" dataField="@name"/>
			<mx:DataGridColumn headerText="国家" dataField="@country"/>
		</mx:columns>
	</mx:DataGrid>
	<mx:ControlBar width="100%">
		<mx:Spacer width="100%"/>
		<mx:Button label="确定" click="submitHandler()"/>
		<mx:Button label="取消" click="cancelHandler()"/>
	</mx:ControlBar>
</mx:TitleWindow>


用户数据源user.xml
<root>
	<User name="David" country="America"/>
	<User name="Tome" country="Canada"/>
	<User name="Montage" country="China"/>
</root>


主界面:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" creationComplete="init()" fontSize="12">
	<mx:Script>
		<![CDATA[
			import com.montage.events.UserEvent;
			import com.montage.model.EventMessage;
			import mx.managers.PopUpManager;
			import com.montage.view.user.UserList;
			
			private var eventBridge:EventBridge= EventBridge.getInstance();
			
			private function init():void
			{
				eventBridge.addEventListener(UserEvent.SELECTED_USER, selectedUserHandler);
			}
			
			/**
			 * 选择好以后的反馈
			 */
			private function selectedUserHandler( event:UserEvent ):void
			{
				textArea.htmlText = "你选择了:<b>" + event.user.name + "</b>("+ event.user.country +")";
			}
			
			/**
			 * 弹出选择用户的窗口PopUpManager
			 */
			private function clickHandler():void
			{
				var userList:UserList = UserList( PopUpManager.createPopUp(this, UserList, true) );
				userList.x = ( width - userList.width ) / 2;
				userList.y = ( height - userList.height ) / 2;
			}
			
		]]>
	</mx:Script>
	<mx:Panel width="400" height="300" layout="vertical" paddingLeft="5" paddingRight="5" paddingTop="5">
		<mx:TextArea id="textArea" width="100%"/>
		<mx:Button label="选择用户" click="clickHandler()"/>
	</mx:Panel>
</mx:Application>
分享到:
评论
2 楼 蒙太奇 2009-02-28  
浮尘过往 写道

你的单件类肯定不是单件的。我要是用一直就用new EventMessage(),那我可以创建无数个实例。。。


#         public function EventMessage() 
#         { 
#             if( instance != null ) 
#             { 
#                 throw new Error("EventMessage是一个单件类,只能被实例化一次!"); 
#             } 
#         } 
#          
#         public static function getInstance():EventMessage 
#         { 
#             if( instance == null ) 
#             { 
#                 instance = new EventMessage(); 
#             } 
#             return instance; 
#         } 

上面写的很清楚了 如果实例已经存在 是会报错的
1 楼 浮尘过往 2009-02-25  
你的单件类肯定不是单件的。我要是用一直就用new EventMessage(),那我可以创建无数个实例。。。

相关推荐

    ActionScript编程 实战项目:视频播放器.docx

    3. **包和类结构**:项目中采用了标准的ActionScript类结构,创建了一个名为`classes`的包,并在其中定义了文档类`main`。这有助于组织代码并提高可维护性。 4. **事件处理**:ActionScript中的事件处理是用户与...

    Flash actionscript3 事件处理

    as3.0事件处理ppt,里面包含鼠标事件类、键盘事件类、计时事件类的讲解及范例

    ActionScript3:五子棋源码

    《ActionScript3:五子棋源码解析与学习指南》 ActionScript3是Adobe Flash Professional、Flash Builder等软件中用于创建交互式动画和富互联网应用(RIA)的主要编程语言。本篇文章将深入探讨如何利用ActionScript...

    AS3中的事件处理.txt

    ActionScript 3.0的事件机制是基于文档对象模型(DOM3)的。这意味着AS3中的事件处理遵循DOM3规范中定义的模式和标准。这一模型提供了统一的方式来处理各种类型的事件,包括但不限于鼠标事件、键盘事件等。这种标准...

    ActionScript3中文手册

    事件处理是ActionScript3中的另一个关键特性。它使用事件监听器模式来处理用户交互和其他程序事件。例如,当用户点击按钮时,相应的事件处理器会被调用。AS3包含了一系列内置的事件类型,如Event.ENTER_FRAME、...

    actionscript3

    本书是国内第一本“面向原因式”(Why-Oriented Book)、全面系统介绍Flash ActionScript 3的书籍。全书共分为5个部分。第一部分:ActionScript 3语言基础;第二部分:ActionScript 3 面向对象编程;第三部分:...

    精通flex3.0 精通 Flex3.0 LCDS ActionScript 事件

    3. **ActionScript事件机制** - **事件模型**:基于观察者模式,事件源触发事件,事件监听器接收并处理事件。 - **事件类型**:包括鼠标事件、键盘事件、组件事件、数据事件等多种类型。 - **事件生命周期**:...

    ActionScript3中文教程

    标签中的“ACTIONSCRIPT3”强调了这个教程的核心内容,即学习AS3的关键语法和特性,包括基本数据类型(如int和Number)、变量、常量、运算符、流程控制(如if语句和循环)、函数以及事件处理。AS3还引入了强类型系统...

    Flash ActionScript 3殿堂之路

    《Flash ActionScript3殿堂之路》共分5个部分。第1部分:ActionScript 3语言基础;第2部分:ActionScript 3面向对象编程;第3部分:ActionScript 3 核心类;第4部分:ActionScript 3主要的Flash Player API;第5部分...

    ActionScript3编程游戏教程

    - **Sprite类详解**:Sprite类是ActionScript3中最常用的基础类之一,它提供了一种容器机制来管理多个显示对象。通过Sprite类可以实现基本的动画效果和简单的用户交互。 - **事件处理**:理解事件驱动编程模式,并...

    事件机制 观察者模式

    在编程领域,事件机制和观察者模式是两个重要的概念,特别是在ActionScript 3(AS3)中被广泛应用。本文将详细探讨这两个主题,以及如何在AS3中实现一个基于观察者模式的事件处理机制。 首先,事件机制是编程中一种...

    actionScript 3 API

    ActionScript 3 (AS3) 是一种面向对象的编程语言,主要用于开发Adobe Flash平台上的交互式内容,如网页游戏、应用程序和动画。AS3 API 是一套接口和类库,为开发者提供了丰富的功能来构建这些应用。这篇文档将深入...

    ActionScript 3.0本地播放器源码(入门学习专用)

    通过分析和实践这个本地播放器源码,学习者能够深入理解AS3中的多媒体处理、事件机制、对象生命周期等核心概念,并能够进一步应用到更复杂的项目中去。同时,这也是对面向对象编程和软件工程原则的实际运用,有助于...

    Flex4.5事件机制

    Flex4.5事件机制是Flex应用程序开发中的核心组成部分,它基于ActionScript 3.0的事件模型,并且遵循DOM3级事件规范。事件机制使得开发者能够轻松响应用户交互和系统事件,为Flex程序员提供了强大且直观的处理工具。 ...

    Actionscript监听事件传多个参数

    3. **多参数传递**:由于ActionScript中的事件处理函数通常只接受一个参数——事件对象,因此如果想要向事件处理器传递额外的信息,则需要借助一些技巧。上述示例中的`create`函数就是一种解决方案,它可以灵活地将...

    Foundation ActionScript 3 Animation:Making Things Move!中文版.part2

    Foundation ActionScript 3 Animation:Making Things Move!中文版。分两部分上传。史上最好的AS3教程!王汝义翻译~

    Foundation ActionScript 3 Animation:Making Things Move!中文版.part1

    Foundation ActionScript 3 Animation:Making Things Move!中文版。分两部分上传。史上最好的AS3教程!王汝义翻译~

    actionscript_百度百科

    2. **ActionScript 2.0**:此版本引入了许多重要的改进,包括面向对象编程的支持、更强大的事件处理机制以及增强的调试工具。 3. **ActionScript 3.0**:这是目前最常用的版本,提供了更加强大的性能和更广泛的API...

    ActionScript

    改进了事件处理机制,使得开发者可以更加灵活地响应用户交互和其他事件。 **2.5 跨平台能力** ActionScript 3.0支持跨平台开发,可以在不同的操作系统上运行,这得益于Adobe Flash Player的强大支持。 #### 三、...

Global site tag (gtag.js) - Google Analytics