Flex4 加载模块Alert弹出框背景透明问题
2014-03-19 10:07
225 查看
先看下这篇文章
http://www.riadev.com/flex-thread-541-1-1.html
基本上做Flex模块化开发的朋友,都会碰到这个问题:如果你的Module处于Application当前域的子域,在Module中尝试使用PopUpManager,Menu,或Alert等被SystemManager顶级类管理的类(基本都是静态类,内部使用单例),那么会得到运行时错误。
如果你尝试去查找解决方案,那大部分人都会告诉你,需要让Application持有对这些管理类的引用,就是在Application中写下面的Hack Code:
PopUpManager;Alert;
复制代码
这样做就可以消除错误,但我们会很好奇,产生这个错误的原因是什么呢?
官方API中对这个情况的解释很简单:对于PopUpManager这样的静态类所依赖的实例,如果先被Module调用,则Module就持有了这个实例,这样如果Application或其它Module尝试使用PopUpManager就会出错。
这里我们的疑问是,ApplicationDomain只是限制类定义的访问(父域不能访问子域的类定义),因为我们已经使用RSL机制,可以确保PopUpManager的相关类定义是被Application持有的,所以即使PopUpManager的实例存在于Module中,Application也是可以获取到的,那为什么PopUpManager还会报错呢?
真正的原因在这里:IFlexModuleFactory
对于Application,它的父容器是SystemManager,而SystemManager本身实现了IFlexModuleFactory接口,所以对于Application,moduleFactory指向了SystemManager
对于Module,如果未指定moduleFactory,则会使用自己的IFlexModuleFactory的一个实现类(这个类被编译器生成,比如[DashboardModule_mx_core_FlexModuleFactory]),也就是说,Module持有了自己的IFlexModuleFactory实现
然后就可以解释上面的那个问题,在Module使用PopUpManager时,如果PopUpManager还没有实例化,则基于自己的IFlexModuleFactory实现来实例化PopUpManager,也就是说,Module的IFlexModuleFactory实例持有了PopUpManager的实例;而当使用PopUpManager时,PopUpManager会尝试从SystemManager中获取PopUpManager的实例,注意SystemManager并不持有它的实例,于是返回为空,造成程序出错。
这样来看,API中的解释是正确的,但解释的不够深入,会造成我们的误解。希望本文能对存在此疑问的朋友有所帮助。
看完之后大家自己能解决吗?
只要在你的主应用中加入Alert框的引用就可以了
private var myAlert:Alert;
http://www.riadev.com/flex-thread-541-1-1.html
为什么在模块化应用中要让Application持有对PopUpManager的引用?
基本上做Flex模块化开发的朋友,都会碰到这个问题:如果你的Module处于Application当前域的子域,在Module中尝试使用PopUpManager,Menu,或Alert等被SystemManager顶级类管理的类(基本都是静态类,内部使用单例),那么会得到运行时错误。如果你尝试去查找解决方案,那大部分人都会告诉你,需要让Application持有对这些管理类的引用,就是在Application中写下面的Hack Code:
PopUpManager;Alert;
复制代码
这样做就可以消除错误,但我们会很好奇,产生这个错误的原因是什么呢?
官方API中对这个情况的解释很简单:对于PopUpManager这样的静态类所依赖的实例,如果先被Module调用,则Module就持有了这个实例,这样如果Application或其它Module尝试使用PopUpManager就会出错。
这里我们的疑问是,ApplicationDomain只是限制类定义的访问(父域不能访问子域的类定义),因为我们已经使用RSL机制,可以确保PopUpManager的相关类定义是被Application持有的,所以即使PopUpManager的实例存在于Module中,Application也是可以获取到的,那为什么PopUpManager还会报错呢?
真正的原因在这里:IFlexModuleFactory
对于Application,它的父容器是SystemManager,而SystemManager本身实现了IFlexModuleFactory接口,所以对于Application,moduleFactory指向了SystemManager
对于Module,如果未指定moduleFactory,则会使用自己的IFlexModuleFactory的一个实现类(这个类被编译器生成,比如[DashboardModule_mx_core_FlexModuleFactory]),也就是说,Module持有了自己的IFlexModuleFactory实现
然后就可以解释上面的那个问题,在Module使用PopUpManager时,如果PopUpManager还没有实例化,则基于自己的IFlexModuleFactory实现来实例化PopUpManager,也就是说,Module的IFlexModuleFactory实例持有了PopUpManager的实例;而当使用PopUpManager时,PopUpManager会尝试从SystemManager中获取PopUpManager的实例,注意SystemManager并不持有它的实例,于是返回为空,造成程序出错。
这样来看,API中的解释是正确的,但解释的不够深入,会造成我们的误解。希望本文能对存在此疑问的朋友有所帮助。
看完之后大家自己能解决吗?
只要在你的主应用中加入Alert框的引用就可以了
private var myAlert:Alert;
相关文章推荐
- 解决ie8兼容性,弹出层遮罩背景不透明问题
- 关于Qt5 使用QQuickWidget加载QML背景设置透明的问题!
- 如何解决在ASP.NET中应用JavaScript的 alert 函数时弹出的窗口背景全部为白色的问题
- UIWebView加载html时,html中的alert();对话框无法弹出问题
- 关于Edittext 弹出软键盘时 ListView背景被挤压的问题(已经解决)
- jQuery解决IE6下PNG图片背景透明问题
- 解决ie下空背景透明div层问题
- android 底部弹出选项,背景透明,PopupWindow的使用
- bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
- Flex4以后Menubar背景设置问题
- IE6下PNG背景透明的显示问题解决方案
- Android设置背景透明的一些问题
- Android部分机型(vivo、乐视、部分红米)对GIF透明背景图片显示白色问题分析
- MFC 加载界面背景图中间有白色背景闪的问题
- android app最顶层弹出透明背景的弹框
- 关于Windows平台下应用程序加载DLL模块的问题.
- 解决Fedora Core 4中Apache无法加载PHP模块的问题
- 关于在页面跳转前alert()不能弹出消息的问题
- PNG背景透明问题
- 【idea页面代码里不能打断点,但是打了断点页面加载时都会停顿一下】。我误以为执行了。牢记!【js alert()没弹出,那就是js没执行】