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 的一个用途是确定已加载模块的父样式管理器

至此终于解决 该问题!

 

posted on 2011-02-15 14:40  ToKens  阅读(274)  评论(0编辑  收藏  举报