URLLoader как получить загруженный URL? - PullRequest
1 голос
/ 23 сентября 2011

Использование URLLoader в любом случае, чтобы получить имя файла загруженного файла?

public function loadCSS():void {
    var urlLoader:URLLoader = new URLLoader();
    urlLoader.addEventListener(Event.COMPLETE, urlLoader_complete);
    urlLoader.load(new URLRequest("cssFile1"));
    urlLoader.load(new URLRequest("cssFile2"));
    urlLoader.load(new URLRequest("cssFile3"));
}

private function urlLoader_complete(evt:Event):void {

    // *****How can I get the file name here?
    var css:String = URLLoader(evt.currentTarget).data;
    // Do lots of stuff

}

Ответы [ 2 ]

5 голосов
/ 24 сентября 2011

Прежде всего, поскольку метод load является асинхронным, эти три вызова в вашем коде будут последовательно переопределять друг друга.Единственный вызов, который приведет к отправке события COMPLETE, будет последним.Если вы хотите загружать файлы асинхронно, вам нужно создать экземпляр URLLoader для каждого.

Во-вторых, (и больше на ваш вопрос) в классе URLLoader нет свойствкоторые позволяют вам получить доступ к URLRequest, с которого изначально вызывался load().

Простой способ обойти это - расширить URLLoader.Например, если вам нужен только URL:

public class MyURLLoader extends URLLoader
{
    private var _url:String;

    public function MyURLLoader(request:URLRequest=null)
    {
        super(request);
    }

    override public function load(request:URLRequest):void
    {
        super.load(request);
        _url = request.url;
    }

    public function get url():String
    {
        return _url;
    }
}

Тогда в вашем коде вы все равно можете использовать один обработчик событий:

public function loadAllCSS():void {
    loadCSSFile("cssFile1");
    loadCSSFile("cssFile2");
    loadCSSFile("cssFile3");
}

private function loadCSSFile(cssURL:String):void {
    var urlLoader:MyURLLoader = new MyURLLoader();
    urlLoader.addEventListener(Event.COMPLETE, urlLoader_complete);
    urlLoader.load(new URLRequest(cssURL));
}

private function urlLoader_complete(evt:Event):void {
    var cssURL:String = evt.target.url;  //now I know where this came from
    var css:String = evt.data;
}
1 голос
/ 24 сентября 2011

Создайте три URLLoaders. В полной функции вы можете проверить идентичность цели события, чтобы определить, откуда вы получаете событие, которое сообщит вам, какой файл загружен. Вместо этого у вас также может быть три разных обработчика, в зависимости от того, как вы хотите разложить код.

В документах неясно, что происходит, когда вы вызываете load несколько раз на одном и том же URLLoader, что (для меня) означает, что это некорректное поведение, и вам следует избегать его. Для вашего примера в документации не указывается, будет ли ваш обработчик событий вызываться один или три раза, и если он вызывается несколько раз, будут ли данные каждый раз отличаться или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...