Flex动态加载时的一些疑惑

蓝色_冰点 2010-12-02 11:07:48
文件夹A里面有a.swf,c.swf
文件夹B里面有b.swf,c.swf
其中两个c.swf都是库文件,a.swf和b.swf都是可独立运行的程序,它们都引用了各自的c.swf

现在,a.swf通过SWFLoader加载了b.swf,而且加到同一个程序域中
如果在B中的c.swf被删除,则b.swf加载失败,说明即使a.swf中已经存在c.swf的定义,但b.swf仍然要加载自己的c.swf
疑惑:此时,B中的c.swf所定义的东西,会不会覆盖A中的c.swf定义的东西?
a.swf对c.swf的某个静态变量进行赋值,然后再加载b.swf,b.swf可以读取得到,似乎B中的c.swf没有对A中的c.swf进行覆盖
B中的c.swf因代码更新,比A中的c.swf多了个函数f(),而且b.swf可以访问f(),似乎B中的c.swf对A中的c.swf已经覆盖

总的来说,因为动态加载的原因,在同一个程序域中,存在两套甚至多套同名的c.swf所定义的内容,但它们之间会有些差异,那么在调用的时候,Flex会如何选择?

求高手解释一下原因,解下惑。。。。。
...全文
267 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzexe 2010-12-07
  • 打赏
  • 举报
回复

swfloader.content.function


如果这个function是引用进来注册的,外部调用应该是最后注册的那个function
如果想知道父级,可以查看loaderinfo等属性.
不知道对不对
leemiki 2010-12-06
  • 打赏
  • 举报
回复
7楼module加载确实是这样的(不过这种情况应该要避免)

楼主说的SWF还是有区别的

加载结构是这样:A 嵌入B、嵌入C(路径1),B嵌入C(路径2)??
蓝色_冰点 2010-12-06
  • 打赏
  • 举报
回复
求求证~~~
leemiki 2010-12-06
  • 打赏
  • 举报
回复
如果是父子之间同名方法或参数的调用那确实涉及到应用程序域的问题了

Flex确实有ApplicationDomain这个类来处理子级重用父级

以前我只是看了下没用过

你可以参照下API写Demo测试下,这个应该不难的~~~
leemiki 2010-12-06
  • 打赏
  • 举报
回复
我有点清楚你的疑惑里,这种关系根本就不是SWF的覆盖,是SWF里面方法的覆盖

难怪我在想两个不同的SWF怎么可能出现你说的A中c.swf覆盖B中c.swf覆盖

楼主表述有误啊!
蓝色_冰点 2010-12-06
  • 打赏
  • 举报
回复
SWFLoader,以及Loader等动态加载一个swf的时候,可以指定一个loaderContext参数,这个参数会决定主程序a.swf和被加载的程序b.swf之间是否可以访问。当然SWFLoader的默认设置是可以的。这就涉及到程序域(ApplicationDomain)这个概念了,但我对此也不熟

程序域的概念在.NET中早就存在,可能是AS3在这方面对.NET的一个抄袭或者说模仿吧
leemiki 2010-12-06
  • 打赏
  • 举报
回复
如果是两个路径不同的同名SWF,那不存在覆盖问题

A加载了B可以理解为A和B是父子关系,Flex父与子之间交互应该没问题吧!

至于B访问到A中的C也只是平级之间的交互通过A中转即可实现

只不过以上的交互跟作用域有关而已~~~
蓝色_冰点 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 leemiki 的回复:]
7楼module加载确实是这样的(不过这种情况应该要避免)

楼主说的SWF还是有区别的

加载结构是这样:A 嵌入B、嵌入C(路径1),B嵌入C(路径2)??
[/Quote]
module加载的情况跟独立运行的SWF加载确实不同,module所需的其它库的引用,全部由主程序负责加载
而SWF的加载,是各顾各的
leemiki 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sharp_ice 的回复:]

引用 1 楼 leemiki 的回复:
所以a.swf,b.swf分别包含c.swf

c.swf是运行时共享库,真实存在的一个swf文件,所以编译后的a.swf和b.swf不会有c.swf的代码,它们只能加载c.swf,然后才能运行c.swf中的代码,只是这个加载过程对于我们来说是看不见的,不用代码去写。c.swf可以理解为windows编程中的一个dll库
是b.swf还是a.swf……
[/Quote]

你用什么方式设置SWFLoader的source

如果是Embed进去,a.swf,b.swf肯定是分别包含c.swf

除非是直接设路径
蓝色_冰点 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 leemiki 的回复:]
所以a.swf,b.swf分别包含c.swf
[/Quote]
c.swf是运行时共享库,真实存在的一个swf文件,所以编译后的a.swf和b.swf不会有c.swf的代码,它们只能加载c.swf,然后才能运行c.swf中的代码,只是这个加载过程对于我们来说是看不见的,不用代码去写。c.swf可以理解为windows编程中的一个dll库
是b.swf还是a.swf??方法f()的作用域是什么?? 是b.swf
f()是B(文件夹)中的c.swf新加的方法。但在A(文件夹)中的c.swf是不存在的
leemiki 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 sharp_ice 的回复:]
B中的c.swf因代码更新,比A中的c.swf多了个函数f(),而且b.swf可以访问f(),似乎B中的c.swf对A中的c.swf已经覆盖
[/Quote]

是b.swf还是a.swf??方法f()的作用域是什么??

通过SWFLoader加载的SWF会编译进原来的SWF中

所以a.swf,b.swf分别包含c.swf
fw176170847 2010-12-02
  • 打赏
  • 举报
回复
选择第一次加载的
之前弄module,出现过这个问题
当你在多个module工程中定义同样的命名空间时,同名的类会出现重叠现象
测试发现第一次加载的会覆盖之后的,
表现为加载一个模块后,切换到另一个模块时,依然会调用上次模块中同名的类。

具体没有求证过,不一定正确。
蓝色_冰点 2010-12-02
  • 打赏
  • 举报
回复
或许我对flex程序域的理解不够
对于程序域看得不是很多
蓝色_冰点 2010-12-02
  • 打赏
  • 举报
回复
SWFLoader的load方法加载,效果就像在浏览器中输入网址一样

主要现象是,b.swf在a.swf的程序域中,所以a.swf能访问的东西,b.swf都能访问
现在是a.swf和b.swf各加载了一套不同版本的c.swf
而b.swf却对两套不同版本的c.swf都似乎能访问,现在问题是,具体会访问哪一个版本的c.swf,版本选择的原则是什么?
leemiki 2010-12-02
  • 打赏
  • 举报
回复
B中的c.swf因代码更新,比A中的c.swf多了个函数f(),而且b.swf可以访问f(),似乎B中的c.swf对A中的c.swf已经覆盖

你都说了B中的c.swf更新,b.swf访问的是自己加载的c.swc中的f()方法,不是很符合常理

这能说明B中的c.swf对A中的c.swf已经覆盖???

4,328

社区成员

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

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