Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   XML и отлов cобытия конца загрузки (http://www.flasher.ru/forum/showthread.php?t=178629)

Wazzabi 25.04.2012 22:30

XML и отлов cобытия конца загрузки
 
Доброе время суток!

Прошу помочь мне в разборе XML парсинга.
и так есть класс LoadConfig
Код AS3:

package  
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.net.URLLoader;
        import flash.net.URLRequest;
        /**
        * ...
        * @author 1
        */

        public class LoadConfig extends Sprite
        {
                public var xml :XML;
                public var loader : URLLoader;
                public var fileName :String = "../config.xml";
 
                public function LoadConfig()
                {
 
                        loader = new URLLoader();
                        var request : URLRequest = new URLRequest(fileName);
                        loader.addEventListener(Event.COMPLETE, configLoadComplete);
                        loader.load(request);
                }
 
                public function configLoadComplete(e:Event):void
                {
 
                        xml = XML(loader.data);
                        trace(xml);
 
 
                }
 
                public function TraceXML():void
                {
                        trace(xml);
                }
        }
 
}

В Main'e создается экземпляр этого класса
Код AS3:

var config :LoadConfig = new LoadConfig();
// и пытаюсь сразу получить данные из xml
config.TraceXML();

После запуска флешки в консоли пишется "null" и второй трейс моя xml'лька
т.е.
Код:

null
<list>
  <params>
    <param>width</param>
    <value>800</value>
  </params>
</list>

можете объяснить почему метод TraceXML выдает null? если даже вместо config.TraceXML() набрать, например trace(config.xml.params.value); выдает null....

Wolsh 25.04.2012 23:00

Потому что еще ничего не загрузилось, это же очевидно.
На загрузку надо время, не то что в интернете, а даже в локальной системе загрузка происходит не мгновенно.

Wazzabi 26.04.2012 09:02

Какой выход? Если сделать так:
Код AS3:

loader.addEventListener(Event.COMPLETE, configLoadComplete);

обработать это событие в функиции configLoadComplete добавить
Код AS3:

dispathEvent(new Event("CONFIG_LOADED"));

а в родителе отловить это событие? Есть какие варианты? как будет более грамотно?

Wolsh 26.04.2012 09:28

1. Естественно, только по событию можно определить, что загрузка произошла и с данными можно работать.
2. Более грамотно будет не заниматься ерундой и не писать класс, который только делегирует обращения к URLLoader'у. То есть, у Вас эта идея возникла скорее всего вместе с уверенностью, что Ваш класс будет возвращать данные, не загрузив их. Но этого не будет. Посмотрите на свой класс и скажите, чем он отличается от самого URLLoader, кроме того что не предоставляет всей его функциональности?
Практически каждый флэшер хотя бы раз в жизни пытался написать свой XMLLoader. И я не исключение. Но смысл в этом появляется, только если Ваш класс будет делать что-то еще, то чего не делает URLLoader. Грузить коллекцию XMLек. Осуществлять перевод с WIN-1251. Создавать какой-то специфический Объект (по сути это уже не лоадер а парсер).
Что можно сделать по-другому? Ну например, можно использовать не События а коллбек, то есть отдавать вашему XMLLoaderу ссылку на функцию, которую надо вызвать по окончании загрузки (хорошо бы так же давать ссылку на функцию, которую надо вызвать, если загрузка завершилась ошибкой).
Но надо помнить, что коллбеки не очень кошерны в AS3, так как не дают возможности строгой типизации.

Wazzabi 26.04.2012 10:40

Ну вообще я пытался написать класс, который грузит настройки и будет возвращать нужны данные в любом месте где это потребуется....

опять копаю не туда?:rolleyes:

Wolsh 26.04.2012 11:44

))))
В смысле Вы сначала рожаете полста детишек, а потом при случае они звонят папе и спрашивают "Папа! А я негр или китаец? А сколько мне лет? А какого цвета на мне рубашка? А почему..?"
Семью надо планировать. Заранее. А потом в соответствии с планом заводить детишек.
Загрузили настройки и насоздавали объектов по этим настройкам. А не наоборот.

Newred 26.04.2012 15:18

В самом "лоадере"
Код AS3:

public function configLoadComplete(e:Event):void
        {
 
                xml = XML(loader.data);
                trace(xml);
                dispatchEvent(new Event("complete"));        // Пускаем событие что загрузка завершена
        }

В Main'e создается экземпляр этого класса

Код AS3:

var config :LoadConfig = new LoadConfig();
 
// Слушаем событие , как только получим, выполнится функция xml_complite
config.addEventListener("complete", xml_complete) ;
 
 
function xml_complete(e:Event):void
{
        config.TraceXML();
}

PS. Есть решения и получше, но желаю вам к ним дойти самостоятельно.
PS2. Привяжите main fla класс к файлу main.as и не пишите в кадрах

Wazzabi 27.04.2012 11:03

Код:

PS2. Привяжите main fla класс к файлу main.as и не пишите в кадрах
а вот сдесь можете по-подробнее?

Newred 27.04.2012 14:32

Вложений: 1
Цитата:

Сообщение от Wazzabi (Сообщение 1077235)
а вот сдесь можете по-подробнее?

Можно и даже нужно )
На ютубе видео как подключал
Во вложении пример.

Wazzabi 28.04.2012 18:33

Newred, спасибо за урок. и сразу возникают несколько вопросов...

в чем плюсы этого способа?
Компиль где нажимать надо на FlashCS5? или в билдере?
Как тоже самое сделать на FlashDevelop'е?
Извиняюсь, что оффтоп вопросы


Часовой пояс GMT +4, время: 05:53.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.