转载:http://apsay.com/?p=919
?
用flex4开发一网站后台,今天遇到一个问题,很诡异,写了个自定义上传图片的组件,用在模块里面,然后再加载主文件后,出现异常。于是试了试,直接把组件放在主文件,发现正常,并且模块里面的同一组件也好了。崩溃。
主文件去掉那个组件后,模块里的继续异常,反复折腾后,检查发现上传成功了,就是Alert的样式没有了,全部堆上顶上方中间。猜想可能是Alert的问题。
于是直接在模块中使用Alert测试,果然,样式出错,崩溃,搜索之,看到这个帖子
Flex4 Module中不能Alert?
在仔细阅读了flex4语言参考里面关于Alert,ApplicationDomain等相关内容后,按里面编程浪子的方法修改,有变化,Alert组件的半透明白色背景出现了,可是主体部分还是堆在上方,崩溃。
于是又试了jialong的方法,修改Alert.show的第四个参数parent:Sprite为Sprite(FlexGlobals.topLevelApplication),直接报错,没有FlexGlobals这个东西。
几乎放弃,看某篇文章,发现Alert.show的第四个参数用的this。修改试之,好了。喜极而泣。
发现如果去掉编程浪子那些东西,只是show加this,Alert主体正常,但是大背景没有,并且按钮颜色也不正常。
感谢qiushuli,编程浪子,jialong。同事帮搜英文,说是adobe说这就是个BUG。郁闷。
好了,给出我的代码,编程浪子用的是ModuleLoader,我的项目用的是IModuleInfo和ModuleManager,看手册发现ApplicationDomain.currentDomain都是加在load方法里面。
Main.mxml
<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="application1_creationCompleteHandler(event)">
?<fx:Script>
??<![CDATA[
???import mx.controls.Alert;
???import mx.core.IVisualElement;
???import mx.events.FlexEvent;
???import mx.events.ModuleEvent;
???import mx.modules.IModuleInfo;
???import mx.modules.ModuleManager;
???
???import mx.managers.PopUpManager;
???private var pop:PopUpManager = new PopUpManager();
???private var info:IModuleInfo;
???private var welcome:IVisualElement;
???private function application1_creationCompleteHandler(event:FlexEvent):void
???{
????loadModule("WelcomeModule.swf");
???}
???private function loadModule(url:String):void
???{
????info = ModuleManager.getModule(url);
????info.addEventListener(ModuleEvent.READY,moduleEventHandler);??????????
????info.load(ApplicationDomain.currentDomain);
???}
???private function moduleEventHandler(event:ModuleEvent):void
???{
????welcome = info.factory.create() as IVisualElement;
????moduleContainer.addElement(welcome);?????
????info.unload();
???}
??]]>
?</fx:Script>
?<s:Group id="moduleContainer" x="0" y="0" />?
</s:Application>
WelcomeModule.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="400" height="300"> ?<fx:Script> ??<![CDATA[ ???import mx.controls.Alert; ???protected function openAlert_clickHandler(event:MouseEvent):void ???{ ????Alert.show("成功","模块使用Alert",Alert.OK,this); ???} ??? ??]]> ?</fx:Script> ?<s:Button id="openAlert" x="10" y="10" label="模块使用Alert" click="openAlert_clickHandler(event)"/> </mx:Module>