flex4/flash builder中动态加载Module并与之交互的正确方式

关于flex中动态加载Module的文章,网上有很多,但多半是基于flex3的,如果在flash builder/flex4中按他们所提供的方法去做,最后将module加载到容器中时,会报:null object reference错误。

经过多番摸索,发现只能在ready回调中,以Object这种基本类型使用,不能强制做任何类型转型,方能正常加载到容器,并与加载后的实例交互(虽然这样flash builder的IDE环境中,无法智能代码提示),原因不明!

开始吧,先创建一个mxml Module,命名为:MyModule.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Module xmlns:fx="http://ns.adobe.com/mxml/2009"
		   xmlns:s="library://ns.adobe.com/flex/spark"
		   xmlns:mx="library://ns.adobe.com/flex/mx" layout="absolute" width="200" height="200">

	<fx:Script>
		<![CDATA[
			public function Test():String
			{
				return txtModule.text;
			}
		]]>
	</fx:Script>
	<s:TextArea right="0" left="0" top="0" bottom="0" contentBackgroundColor="#C8BBBB" text="this is a textarea in module" id="txtModule"/>
</mx:Module>

然后在一个mxml application中动态加载它

<?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="400" minHeight="300" applicationComplete="application1_applicationCompleteHandler(event)">
	<s:layout>
		<s:BasicLayout/>
	</s:layout>

	<fx:Script>
		<![CDATA[
			import mx.core.IVisualElement;
			import mx.events.FlexEvent;
			import mx.events.ModuleEvent;
			import mx.modules.IModuleInfo;
			import mx.modules.ModuleManager;

			private var module:IModuleInfo;
			private var first:Boolean=true;//是否首次加载的判断标志
			private var moduleInstance:Object;//用于保存加载后的实例引用

			protected function button1_clickHandler(event:MouseEvent):void
			{
				//非首次加载(先卸载)
				if (!first)
				{
					module.unload();
					pnl.removeElement(moduleInstance as IVisualElement);
				}
				initModule();
				module.load();
				btn1.enabled = false;
			}

			private function onModuleReady(e:ModuleEvent):void
			{
				moduleInstance  = e.module.factory.create();//注:这里千万不能用as做任何的转型,否则就报null object reference错误,原因不明
				this.pnl.addElement(moduleInstance as IVisualElement);
				//由于只能以Object方式操作,所以下面的代码,没办法智提示,只以盲打
				moduleInstance.txtModule.text = Math.random().toString();
				moduleInstance.x = moduleInstance.y = 10;
				trace(moduleInstance.Test());
				first = false;
				btn1.enabled = true;

			}

			private function initModule():void
			{
				module = ModuleManager.getModule("MyModule.swf");
				module.addEventListener(ModuleEvent.READY,onModuleReady);
			}

			//应用加载完成时,就预先将Module初始化(甚至这时就可以load,只是不显示而已,以改善用户体验)
			protected function application1_applicationCompleteHandler(event:FlexEvent):void
			{
				initModule();
			}

		]]>
	</fx:Script>	

	<s:Panel id="pnl" title="动态加载Module" left="10" top="10" bottom="50" right="10"></s:Panel>

	<s:Button click="button1_clickHandler(event)" label="load" horizontalCenter="0" bottom="10" id="btn1">

	</s:Button>
</s:Application>
时间: 2024-09-12 14:17:20

flex4/flash builder中动态加载Module并与之交互的正确方式的相关文章

flash as3 中动态加载库类失败解决方法

flash as3 中动态加载库类失败解决方法 这是错误的写法 for (var i:number=1; i<4; i++) { var mc1:mc1 = new mc1(); addchild(mc1); } as3里怎么循环加载库里的mc1 mc2 mc3类 就是下面意思是怎样个的写法 for (var i:number=1; i<4; i++) { var "mc"+i:"mc"+i = new "mc"+i(); addch

python中动态加载模块和类方法实现

python中动态加载模块和类方法实现测试代码   文件名: mytest.py 具体代码如下:   注意:模块名,类名,方法名都是变量.   #coding=UTF-8 class TestClass: def sub(self,a,b): return a-b def add(self,a,b): return a+b def echo(self): print "test" def main(): class_name = "TestClass" #类名 mo

Visual Basic .NET 中动态加载类(一)

visual|动态|加载 Visual Basic .NET 中动态加载类 · ··Microsoft 摘要:理想情况下,编写软件系统之前我们就应该知道此软件系统需要完成哪些操作.但实际情况并非如此,因此我们的系统应该是可以调整的. 最能体现这种适应性的是动态集成新功能的能力.例如,在 Windows 窗体应用程序中,这种能力是指加载编译原始应用绦蚝芫靡院蟠唇ǖ拇疤宓哪芰Α?/P> 这种操作在 Microsoft Visual Basic 6.0 中几乎是不可能的,但是在 Visual Basi

在ASP.NET中动态加载内容(用户控件和模板)

asp.net|动态|加载|控件|模板 在ASP.NET中动态加载内容(用户控件和模板)要点:1. 使用Page.ParseControl2. 使用base.LoadControl第一部分:加载模板 下面是一个模板"<table width=100%><tr><td width=100% colspan=2 runat=server id=ContainerTop></td></tr><tr><td width=30%

从XML中动态加载菜单的示例

本文配套源码 这个案例是一个基于VS2005的WinForm菜单控件的例子,功能是从XML中动态加载菜单数据到MenuTrip控件上.这个案例中用到了XML,反射之类的技术.当然实用价值有限,仅供学习参考之用. 首先创建一个WinForm项目,在Form1上放置一个MenuTrip控件,将其命名为MainMenu. 在项目中添加一个XML文件,命名为Menu.xml,代码如下: MenuXml 1<?xml version="1.0" encoding="utf-8&q

angularjs directive-agularjs中在directive中动态加载template如何实现

问题描述 agularjs中在directive中动态加载template如何实现 由于 agularjs内的$http是异步的请求方式 而我的html代码有一部分存储在后台,遂使用watch来监听html变量的变化 ,但问题是拿到了最新的html字符串如何赋给directive中的template.

VC中动态加载ODBC解决方法

在使用 VC. VB. Delphi等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置 ODBC数据源.对于一般用户而言,配置 ODBC数据源可能是一件比较困难的工作.      而且,在实际应用中,用户往往要求在同一个应用程序中访问不同的数据源,因此采用一般的加载方法就有了无法克服的缺陷.为能在程序中完成这一工作,方便应用程序的使用,本文以 VC为开发环境介绍两种在应用程序中动态加载 ODBC系统数据源的方法. 方法一:修改注册表 设计思路 一般情况下,当用户在控制面板中配置好

osg-OSG中动态加载模型,并动态显示??

问题描述 OSG中动态加载模型,并动态显示?? 比如我想先显示一个奶牛模型,显示完之后我又要在牛模型不消失的情况下再加载一个飞机模型并显示,相当于显示了两个模型,怎么实现???? 解决方案 动态加载模型 解决方案二: http://www.cnblogs.com/mazhenyu/p/3522056.html

net 4 0-获取PlaceHolder中动态加载的多个TextBox的值。

问题描述 获取PlaceHolder中动态加载的多个TextBox的值. 获取PlaceHolder中动态加载的多个TextBox的值. 解决方案 给每个textbox一个id,然后用 $("#你的id").val() 获取.