`

求助:Flex中Module模块间通信问题。

    博客分类:
  • Flex
阅读更多

 

 

      Application中加载导航栏作用的Module  header.swf,其中有一个方法switchBodyState(STATE_URL:String)方法,用来切换Body的状态,

 

       Application中同时加载Body 的Module  body.swf,body.swf当前默认状态时home,另外还有product、service、suggestion共四个状态。

 

       在此要用到Flex Module间通信,问题是:Application如何取得header.swf中的方法获取参数,传给body.swf进行状态转换?

 

求助了!!!网上找了很多资源,基本都是导航栏直接放在Application中的,而不是通过加载获得的。

 

有一点思路,本人Flex新手,不清楚具体怎样实现:

 

header.swf ——》application ——》body.swf

 

 

 

分享到:
评论
1 楼 csdn_zuoqiang 2010-10-14  
问题
访问加载的模块和传递数据。
解决办法
使用mx.modules.ModuleLoader的child属性和mx.modules.IModuleInfo实例的factory属性,监听事件,调用公开方法,访问公开属性。
讨论
应用程序shell 通过ModuleLoader 和ModuleManager 的属性与被加载模块通信。对于<mx:Application>实例来说通信没有限制,因为模块也可以加载另一模块,使得被加载模块访问父模块和应用程序是一样的。

要访问加载模块的数据,你需要把指定载入实例的返回属性的类型重新映射为原来被载入的模块类。当使用<mx:ModuleLoader>对象时,可通过child属性获得模块实例:

<mx:Script>
<![CDATA[
private var myModule:MyModule;
private function moduleReadyHandler():void {
myModule = moduleLoader.child as MyModule;
myModule.doSomething();
}

]]>
</mx:Script>
<mx:ModuleLoader id="moduleLoader" url="MyModule.swf"
ready="moduleReadyHandler();" />


当主应用程序可以访问被加载模块的数据时,moduleReadyHandler时间处理函数被调用。

<mx:ModuleLoader>的child属性类型重新映射为原模块类类型,现在你可以调用模块的公开方法访问其数据了。

而当使用ModuleManager 类为父应用程序时, 模块实例是通过IModuleInfo 的IFlexModuleFactory实例的create方法返回的:

private var _moduleInfo:IModuleInfo;
private function creationHandler():void {
_moduleInfo = ModuleManager.getModule( 'MyModule.swf');
_moduleInfo.addEventListener( ModuleEvent.READY,moduleLoadHandler );
_moduleInfo.load();
}
private function moduleLoadHandler( evt:ModuleEvent ):void {
var myModule:MyModule = _moduleInfo.factory.create() as MyModule;
myModule.doSomething();
}


当ModuleLoader的child属性或IFlexModuleFactory.create方法返回值进行类型映射后,模块和主应用程序的联系分成紧密了,要想减少模块和它的类实例的紧密性,一般的做法是使用接口。使用接口,可使你的代码更具灵活性, 使你的主应用程序能连接更多的类实例。

为了例证当开发模块化应用程序时使用接口所产生的灵活性,我们假定创建一个供用户输入信息的表单模块。根据程序的步骤和变化,你可能发现你需要更多类型的表单。虽然他们可能显示不同的外观,或者对用户数据执行不同的操作,但是他们访问模块数据的方法却是一样的。采用实现接口的不同模块可增加你的应用程序的灵活性。

下面的例子是一个接口,列出了和用户信息相关的属性方法:
package
{	
	import flash.events.IEventDispatcher;

	/**
	 * 一个接口,列出了和用户信息相关的属性方法
	 * @author Administrator
	 */
	public interface IUserEntry extends IEventDispatcher
	{
		function getFullName():String;
		function get firstName():String;
		function set firstName(str:String):void;
		function get lastName():String;
		function set lastName(str:String):void;
	}
}


创建实现此接口的模块,申明<mx:Module>的implements属性为IUserEntry接口:
<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml"
           implements="IUserEntry" layout="vertical" width="100%" height="100%">
           
	<mx:Metadata>[Event(name="submit", type="flash.events.Event")]</mx:Metadata>
	
	<mx:Script>
		<![CDATA[
		
			private var _firstName:String;
			private var _lastName:String;
			public static const SUBMIT:String="submit";

			private function submitHandler():void
			{
				firstName=firstNameInput.text;
				lastName=lastNameInput.text;
				dispatchEvent(new Event(SUBMIT));
			}

			public function getFullName():String
			{
				return _firstName + " " + _lastName;
			}

			[Bindable]
			public function get firstName():String
			{
				return _firstName;
			}

			public function set firstName(str:String):void
			{
				_firstName=str;
			}

			[Bindable]
			public function get lastName():String
			{
				return _lastName;
			}

			public function set lastName(str:String):void
			{
				_lastName=str;
			}
		]]>
	</mx:Script>
	<mx:Form>
		<mx:FormItem label="First Name:">
			<mx:TextInput id="firstNameInput" width="100%"/>
		</mx:FormItem>
		<mx:FormItem label="Last Name:">
			<mx:TextInput id="lastNameInput" width="100%"/>
		</mx:FormItem>
		<mx:Button label="submit" click="submitHandler();"/>
	</mx:Form>
</mx:Module>


这个模块提供一些控件供用户输入和提交用户信息。getter/setter 属性和getFullName方法将在模块的<mx:Script> 标签里实现。由实现IUserEntry 接口的mx.modules.Module 和mx.modules.ModuleBase类建立firstName和lastName的数据绑定。

要访问这里或其他实现IUserEntry接口的模块数据,父已运行必须对具体模块加载类的相应属性进行类型映射。

下面的例子使用<mx:ModuleLoader>的child属性实例访问实现IUserEntry模块的数据:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
	<mx:Script>
		<![CDATA[
			private var myModule:IUserEntry;

			private function moduleReadyHandler():void
			{
				myModule=moduleLoader.child as IUserEntry;
				myModule.addEventListener("submit", submitHandler);
			}

			private function submitHandler(evt:Event):void
			{
				welcomeField.text='Hello,' + myModule.getFullName();
				trace(myModule.firstName + " " + myModule.lastName);
			}
		]]>
	</mx:Script>
	<mx:ModuleLoader id="moduleLoader" url="ContactEntry.swf" ready="moduleReadyHandler();"/>
	<mx:Label id="welcomeField"/>
</mx:Application>


<mx:ModuleLoader>实例的ready事件处理函数建立对用户信息提交的事件处理器。当submitHandler方法被调用时,通过模块的getFullName实现打印一些字符串。把ModuleLoader实例的child属性类型映射为IUserEntry接口,是确保应用程序和模块之间的松耦合设计,这使得你可以动态的与实现统一接口的不同模块类交互。

父SWF访问模块数据没有限制,通过parentApplication属性模块也可以访问父应用程序数据:
<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="creationHandler();">
	<mx:Script>
		<![CDATA[
			private function creationHandler():void
			{
				//Flex SDK 3.1.0里已找不到getInformation方法
				infoField.text=parentApplication.getInformation();
			}
		]]>
	</mx:Script>
	<mx:Text id="infoField" width="286" height="78"/>
</mx:Module>


当模块完成初始化后,creationHandler方法被调用,调用父应用程序getInformation方法返回的子节点组件信息。

模块的parentApplication属性继承自UIComponent超类,是一个Object类型。动态类Object是所有类的父类。因此你可以通过parentApplication实例访问数据而不用关心父类实现。也就是说模块也直接调用父应用程序的属性,不管其属性是否可用而引发的运行时异常。

一般来讲,模块是不应该访问父应用程序数据的,这是根据模块和父应用程序之间的松耦合设计原则决定的。为了减小这种联系,你可以把载入模块的应用程序映射为接口,就像上面的例子那样做。要确保不同的应用程序都能和同一个模块通信,强烈建议直接提供父应用程序数据给模块而不是通过动态 parentApplication属性.做到了这些你就能轻松地开发模块化应用程序了。

相关推荐

    Flex Module间通信

    Flex模块间通信是Adobe Flex应用程序开发中的一个重要概念,它允许不同模块之间共享数据、功能和服务。在大型项目中,模块化设计有助于代码组织和管理,提高代码复用性,同时降低复杂度。本示例将深入讲解如何在Flex...

    Flex 基于Module模块的开发资料完整版

    - **委托**:在 Flex 中,可以使用委托模式实现组件间的通信,提高代码的灵活性和可维护性。 - **文件上传**:Flex 提供了 FileReference 类支持文件上传,可以结合服务端处理文件上传请求。 - **操作 Office ...

    Flex中Module间的通讯和在Application中的切换

    在Flex中,模块间的通信主要通过以下几种方式实现: 1. **事件监听**:模块可以通过发布自定义事件或使用内置事件(如FlexEvent.MODULE_LOAD)来传递信息。主应用程序或其他模块可以通过添加事件监听器来接收这些...

    display: flex弹性布局

    display: flex弹性布局

    Adobe官方Flex3 Module模块设计经典资料(附源代码)

    在Flex3的Module模块程序设计中,在Google中进行了大量的资料查找,综合比较各个资源后,将我认为最有价值的资料放在这里(全英文的)。 下载包中包括: 1、Adobe Creating Mudule Application.pdf 2、相似例子的源...

    Flex模块化开发实例

    使用Flex Builder或Adobe Animate CC等工具,可以通过创建新的Module项目来生成模块。在模块项目中,我们可以编写组件、服务和业务逻辑代码。 4. **模块加载**: Flex提供了`mx.modules.ModuleLoader`组件,用于...

    FLEX 与现有开发语言的通信全面解析

    八、数据序列化与反序列化:在通信过程中,数据需要在不同平台间进行序列化和反序列化。例如,AMF提供了高效的序列化机制,而SOAP则依赖于XML格式进行数据交换。 总结,Flex作为一种跨平台的RIA开发工具,其通信...

    Flex之模块化

    Flex模块化主要通过Flex Module Framework(模块框架)实现,这是一个内置于Flex SDK中的组件,支持在运行时动态加载和卸载模块。这种动态加载能力使得Flex应用程序能够根据用户需求或网络状况来决定加载哪些模块,...

    eclipse项目中同时开发j2ee模块和flex客户端模块

    在Eclipse环境中,同时开发J2EE模块和Flex客户端模块是一项常见的任务,特别是在构建富互联网应用程序(Rich Internet Applications, RIA)时。这样的组合允许后端服务器处理业务逻辑和数据管理,而前端Flex客户端则...

    flex与java通信

    Flex和Java之间的通信是Web应用程序开发中的一个重要环节,它允许前端用户界面(UI)与后端服务器进行数据交互。Flex是一种基于Adobe Flash Player或Adobe AIR运行时的富互联网应用程序(RIA)开发框架,而Java则是...

    Flex 加载 Module

    Flex加载Module是Adobe Flex框架中的一个关键特性,它允许开发者将大型应用程序分解为多个模块,每个模块都可以独立加载和卸载。这样的设计提高了应用程序的响应速度,降低了初始加载时间,并且使得用户能够在需要时...

    flex一个动态添加卸载Module的例子

    模块(Module)是Flex应用程序的一个重要组成部分,它允许我们将大项目分解为更小、更易于管理的部分。动态加载和卸载Module是优化应用程序性能和减少初始化时间的有效方法,特别是在需要根据用户需求按需加载功能的...

    flex 模块化modules源码例子

    2. **Flex模块化机制**:在Flex中,模块(Module)是可以通过`mx:Module`标签定义的独立的SWF文件。它们在运行时按需加载,有助于减少初始加载时间,并且可以动态地添加或移除模块。使用模块可以优化性能,因为不是...

    flex中文帮助.rar

    通过“flex中文帮助”压缩包中的资料,初学者可以逐步了解和掌握这些基础知识,通过实例练习来巩固理论知识,为未来深入的Flex开发打下坚实的基础。每个章节都可能涉及上述的一个或多个知识点,通过实践和理解,学习...

    display:flex布局语法

    - flex:是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto,后两个属性可选。该属性有两个快捷值auto(1 1 auto)和none(0 0 auto)。 - align-self:允许单个项目有与其他项目不一样的对齐方式...

    Flex中文教程中文文档

    Flex是Adobe公司开发的一种用于构建富互联网应用程序(RIA)的开放源代码框架。...通过这个教程,读者不仅可以理解Flex的基本概念,还能掌握实际开发中的技巧和最佳实践,从而成为一名熟练的Flex开发者。

    Flex中文帮助 学习Flex的好资料

    BlazeDS或LCDS是常用的Flex服务端技术,用于处理Flex客户端与Java或.NET服务端的数据通信。 7. **图形和动画**:由于Flex基于Flash技术,因此在图形绘制和动画制作方面有天然优势。可以利用Flex的绘图API创建复杂...

    FLEX4025十六通道热电阻温度采集模块用户手册-V1.0.pdf

    FLEX-4015热电阻采集模块是FLEX-4000系列智能测控模块之一,广泛应用于温度/电阻测量的工业场合,提供了热电阻/电阻信号的采集以及转换,线性处理并转换成线性化的数据值,经RS-485 总线传送到控制器。FLEX-4015具有...

    FlexModule_j2ee Flex 与JSP 整合用的.jar 文件

    FlexModule_j2ee的核心是将Flex组件与JSP页面集成,通过这个.jar文件,开发者可以在JSP中引入Flex标签,如`&lt;flex:mx:Application&gt;`等,这些标签能够直接在JSP页面中嵌入Flex组件,使得Flex的应用能够在JSP环境中无缝...

    FlexModule_j2ee.zip

    FlexModule_j2ee.zip是一个压缩包,包含了将Flex前端技术集成到JSP(JavaServer Pages)和J2EE(Java 2 Platform, Enterprise Edition)后端环境中的示例工程。这个项目旨在展示如何在传统的Web应用中嵌入富互联网...

Global site tag (gtag.js) - Google Analytics