Flex:将资产加载到外部加载的模块中

时间:2020-03-06 14:40:01  来源:igfitidea点击:

因此,我有一个Flex项目,该项目使用ModuleManager而不是模块加载器加载模块。我遇到的问题是,加载外部资产(如视频或者图像)的路径必须相对于Module swf ...而不是相对于加载模块的swf。

问题是如何使用相对于父SWF而不是模块SWF的路径将资产加载到已加载的模块中?

啊!因此,在研究SWFLoader类时,我在私有函数loadContent中发现了以下代码块:

// make relative paths relative to the SWF loading it, not the top-level SWF
    if (!(url.indexOf(":") > -1 || url.indexOf("/") == 0 || url.indexOf("\") == 0))
    {
         var rootURL:String;
         if (SystemManagerGlobals.bootstrapLoaderInfoURL != null && SystemManagerGlobals.bootstrapLoaderInfoURL != "")
              rootURL = SystemManagerGlobals.bootstrapLoaderInfoURL;
         else if (root)
              rootURL = LoaderUtil.normalizeURL(root.loaderInfo);
         else if (systemManager)
              rootURL = LoaderUtil.normalizeURL(DisplayObject(systemManager).loaderInfo);

              if (rootURL)
              {
                   var lastIndex:int = Math.max(rootURL.lastIndexOf("\"), rootURL.lastIndexOf("/"));
                    if (lastIndex != -1)
                         url = rootURL.substr(0, lastIndex + 1) + url;
               }
          }
}

因此,显然,Adobe付出了额外的努力来使图像加载到实际的SWF文件中,而不是在顶级SWF文件中加载(没有其他标志可供选择...),所以我想我应该提交功能请求以具有某种"相对于SWF加载"标志,直接编辑SWFLoader,或者我应该拥有相对于单个SWF的所有内容,而不是顶层...是否有任何建议?

解决方案

我们可以导入mx.core.Application,然后使用Application.application.url获取模块中主机应用程序的路径,并将其用作构建URL的基础。

有关处理URL的帮助,请参见标准Flex库中的URLUtil类和as3corelib项目中的URI类。

我们可以在模块中使用this.url并将其用作baseURL。

var urlParts:Array = this.url.split("/");
urlParts.pop();
baseURL = urlParts.join("/");
Alert.show(baseURL);

并使用{baseURL +" /location/file.ext"}代替/ location / file.ext