Flex: загрузка ресурсов во внешние модули - PullRequest
3 голосов
/ 24 сентября 2008

Итак, у меня есть проект Flex, который загружает модуль с помощью ModuleManager, а не загрузчик модулей. Проблема, с которой я сталкиваюсь, заключается в том, что для загрузки внешнего ресурса (например, видео или изображения) путь для загрузки этого ресурса должен быть относительно SWF-модуля ... не относительно SWF-файла, который загрузил модуль.

Вопрос в том, как я могу загрузить актив в загруженный модуль, используя путь относительно родительского swf, а не модуля swf?


Arg! Так что при копании в классе 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, а не верхнего уровня ... какие-либо предложения?

Ответы [ 2 ]

2 голосов
/ 25 сентября 2008

Вы можете импортировать mx.core.Application, а затем использовать Application.application.url , чтобы получить путь к хост-приложению в вашем модуле и использовать его в качестве основы для построения URL-адресов.

Для получения справки по работе с URL-адресами см. класс URLUtil в стандартных библиотеках Flex и класс URI в проекте as3corelib .

1 голос
/ 12 февраля 2010

Вы можете использовать this.url в модуле и использовать его как baseURL.

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

и используйте {baseURL + "/location/file.ext"} вместо /location/file.ext

...