转载: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>