Flex动态加载机制

蓝色_冰点 2010-09-08 11:49:02
发现一个非常头痛的动态加载现象,不管是用ModuleManager还是Loader之类的东西来进行动态加载,总会有这么一个现象:
例如:A.swf仅有一个按钮(用来触发加载的动作),及一个group(用来装动态加载的内容)
B.swf为被加载对象,其中放了一个TextInput控件,
当A.swf加载B.swf以后,A.swf确实可以访问B.swf中写义的一些东西,但如果A.swf要显示B.swf,立刻出现异常
然而,如果在A.swf中也加入了一个TextInput的时候,A.swf就能正常显示B.swf
也就是说,如果B.swf中使用了某些控件,而A.swf却没有使用的话,就发生错误

补充一些:A和B是两个分开的工程。
我做A的目的就是把它作为一个加载的框架,包括登陆、菜单、权限等功能。
而B就是A要加载的其中一个模块

求高手给个解决的办法或解释。。。
...全文
848 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝色_冰点 2010-09-10
  • 打赏
  • 举报
回复
我用的是FLEX4

有人做过框架用SWFLoader来加载可独立运行的app.swf而非module的吗?
如果是通过SWFLoader的话,优点是可以解决这种框架找不到类之类的错误
缺点是子模块因为是可以独立运行的swf文件,所以必定比module文件稍大一点,如果网速可以的话,这点倒不成问题,还有就是这样的话主框架与子模块之前的通信就复杂一些了
DAVID_DEEYE 2010-09-09
  • 打赏
  • 举报
回复
herowach, 你的问题应该是在发布时,跨域的问题,这个问题我还一直没有解决呢,呵呵
太懒了,,,,,

楼主的这个问题不明白,解决后一定贴出来给大家学习啊:)

大连最好的家政
herowach 2010-09-09
  • 打赏
  • 举报
回复
我目前也是框架加载module页面,不过我用的flex3,我只是把我所经历过的说下,不一定就是你们遇到的情况,昨天我的app里还有5个木偶变量,但现在已经一个都没有了,所以module中类找不到的情况,应该是能解决的
蓝色_冰点 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 herowach 的回复:]
……
[/Quote]
问题不在domain,domain的作用我想你也应该知道,它决定了代码的访问范围,两个不同的domain的SWF是不能互相访问的。
而我现在的问题是,A.swf能够访问B.SWF中定义的东西,通过getDefinitionByName的反射方法是可以取得到B.swf中定义的任何类的。只是在如果要显示其中的某个控件的时候,就发生了错误。

但后来又做了个实验,把B中的s:TextInput换成mx:TextInput的话,即使A.swf中没有mx:TextInput也能正常显示。以及其它类似的spark组件,与其对应的mx组件都正常。
所以能解释的就是spark组件与mx组件的区别造成的。而spark组件与mx组件最大的区别就是,spark组件是逻辑与皮肤的代码是分开的。
而且,在A.swf中声明了某个组件变量后,A.swf编译后的大小会增加几K

所以实初步判断就是,swf启动的时候,由所启动的swf文件也就是A.swf加载相应的所需的皮肤代码,而B中编译进的主要是逻辑代码。因为A.swf不知道B.swf使用了s:TextInput的皮肤,所以并没有编译s:TextInput的皮肤,所以加载的时候,A是可以访问B的内容,但显示的时候因为没有皮肤代码,造成错误。而如果A.SWF声明了s:TextInput的时候,就会把s:TextInput的皮肤代码编译进来,所以大小增加的部分应该包含了皮肤代码,这样就不会出错
水中影子 2010-09-09
  • 打赏
  • 举报
回复
现在也是一个个声明,没有什么好的解决办法吗?
herowach 2010-09-08
  • 打赏
  • 举报
回复
设ModuleLocator的applicationDomain = ApplicationDomain.currentDomain;试试
herowach 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sharp_ice 的回复:]
引用 7 楼 leemiki 的回复:
如果自己做着玩那倒没事,如果是公司项目这样做确实不太好,O(∩_∩)O~

你把错误信息贴一下吗!!!

靠,我倒是想贴出来,我都try了,结果出错的时候就是假死掉了
连catch里面的东西一句都执行不了

这Flex弄的。。。。难怪被苹果封杀。。。
[/Quote]

遇到问题的时候,首先想到的不应该是抱怨....因为抱怨也没有用。

我以前也遇到过你的问题,但自从设置了applicationDomain = ApplicationDomain.currentDomain;后,就不会找不到内置类了,但还会有4,5个VO找不到(我的应用VO有很多),以前没什么头绪没细查,就在APP里定义了那4,5个VO的变量就好了,今天看到你的帖子检查后才发现,原来问题在for each上面,
使用了for each(var vo:XXVO in XXX)这种就会出现我的情况,可能是因为在module中for each不会导入类所致,改成遍历集合用集合+下标的情况就没有这个问题了。

至于你还是找不到的情况,你将applicationDomain = ApplicationDomain.currentDomain;放在ModuleLocator的creationComplete里去试试,应该是设过这个属性就不会有你的问题了

herowach 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 leemiki 的回复:]
。。。。你这东西确实有点牛叉,错误信息都显示不了
[/Quote]

类没导入是运行时错误,不是编译时的,运行时会报某某类找不到的错
leemiki 2010-09-08
  • 打赏
  • 举报
回复
。。。。你这东西确实有点牛叉,错误信息都显示不了
蓝色_冰点 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 leemiki 的回复:]
如果自己做着玩那倒没事,如果是公司项目这样做确实不太好,O(∩_∩)O~

你把错误信息贴一下吗!!!
[/Quote]
靠,我倒是想贴出来,我都try了,结果出错的时候就是假死掉了
连catch里面的东西一句都执行不了

这Flex弄的。。。。难怪被苹果封杀。。。
fw176170847 2010-09-08
  • 打赏
  • 举报
回复
一个个声明吧
fw176170847 2010-09-08
  • 打赏
  • 举报
回复
木有办法
leemiki 2010-09-08
  • 打赏
  • 举报
回复
如果自己做着玩那倒没事,如果是公司项目这样做确实不太好,O(∩_∩)O~

你把错误信息贴一下吗!!!

蓝色_冰点 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 leemiki 的回复:]
楼主采用的是动态加载SWF,还是动态加载module???
[/Quote]
是编译成swf文件的module

[Quote=引用 5 楼 herowach 的回复:]
A.swf是一个App吗?
如果还是没办法,只有在A里声明木偶变量,
例如private var ti:TextInput;
不用具体产生实例,这样跟你放一个具体的TextInput效果是一样
[/Quote]
A.swf是一个APP
你所说的办法可以解决,但问题是,A.swf作为一个框架,它无法保证其它子模块加所用到了哪些控件。
那么为了保证万无一失,只能像这样,所有控件都声明一个变量。。。。。
总觉得这种解决方法有点。。。。像耍赖一样,把一箩筐的东西全声明进A.swf里才能保证不会发生错误
herowach 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sharp_ice 的回复:]
引用 1 楼 herowach 的回复:
设ModuleLocator的applicationDomain = ApplicationDomain.currentDomain;试试

试过,一样的结果。
[/Quote]

A.swf是一个App吗?
如果还是没办法,只有在A里声明木偶变量,
例如private var ti:TextInput;
不用具体产生实例,这样跟你放一个具体的TextInput效果是一样
leemiki 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lieri111 的回复:]
这个真的很麻烦,而且相互控制的话更麻烦,不建议这么做,一般是包含控件之类的就可以了
[/Quote]

采用Flex动态加载机制对与性能的提升很有必要

现在做的项目,稍大点我都会到这种技术!

楼主采用的是动态加载SWF,还是动态加载module???

passself 2010-09-08
  • 打赏
  • 举报
回复
这个真的很麻烦,而且相互控制的话更麻烦,不建议这么做,一般是包含控件之类的就可以了
蓝色_冰点 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 herowach 的回复:]
设ModuleLocator的applicationDomain = ApplicationDomain.currentDomain;试试
[/Quote]
试过,一样的结果。

4,327

社区成员

发帖
与我相关
我的任务
社区描述
多媒体/设计 Flex
社区管理员
  • Flex
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧