As 动态载入模块Bug【原创】
昨天Flex项目升级,从3.5的SDK升级到4.0,中间出现不少问题,截止至现在刚刚解决最大的问题就是swf模块动态载入的问题。
3.5代码如下:
//加载显示Widget
private function loadWidget(id:Number, url:String, preload:String):void
{
info=ModuleManager.getModule(url);
info.data={id: id, preload: preload == "" ? url : preload};
info.addEventListener(ModuleEvent.READY, widgetReadyHandler);
info.load();
if (url != "")
{
this.cursorManager.setBusyCursor();
}
}
之前代码一直这么写没问题,但是到4.0的SDK之后出现动态加载的模块样式无法使用,怀疑是样式管理器没有继承到子模块,于是使用new 的方式添加对象:
var widget:GridWidget = new GridWidget();
widgetBox.addChild(widget as DisplayObject);
上面这种方式没有问题,果然和猜测的一样,奇怪的是3.5并没有这样的问题,4.0的BUG?
无意中想到,既然样式管理器会丢失,难道没有载入指定样式的方法吗?答案是有的,在载入的时候可以指定相关参数
//加载显示Widget
private function loadWidget(id:Number, url:String, preload:String):void
{
info=ModuleManager.getModule(url);
info.data={id: id, preload: preload == "" ? url : preload};
info.addEventListener(ModuleEvent.READY, widgetReadyHandler);
info.load(null,null,null,FlexGlobals.topLevelApplication.systemManager);
if (url != "")
{
this.cursorManager.setBusyCursor();
}
}
注意红色代码,这里指定了moduleFactory:IFlexModuleFactory,方法的注释说明为:调用者的 moduleFactory。moduleFactory 的一个用途是确定已加载模块的父样式管理器
至此终于解决 该问题!