Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как правильно применить Event.COMPLETE (http://www.flasher.ru/forum/showthread.php?t=143734)

a6279019 24.08.2010 17:02

Как правильно применить Event.COMPLETE
 
Есть главный класс
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.text.*;
        import MyClass;
        public class Main extends Sprite
        {
                public var tf: TextField;
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        tf = new TextField();
                        textf.text=" ";
                        addChild(textf);
                        var temp:MyClass = new MyClass();
                        tf.appendText(MyClass.vardata);
                }
 
        }
 
}

MyClass:
Код AS3:

public function Download(){ 
                        var request:URLRequest = new URLRequest("http://www.domain.com/data.xml");
                        var loader:URLLoader = new URLLoader();
                        loader.addEventListener(Event.COMPLETE, completeHandler);
                        try{
                                loader.load(request);
                        }
                        catch (error:Error){
                                trace("Error");
                        }
                }
 
                private function completeHandler(event:Event):void{
                        var dataXML:XML = XML(event.target.data);
                        vardata = dataXML.toXMLString();
                }

При обработке этого кода переменная vardata получается пустой, т.к. не успевает получить значение. Что надо сделать, что б vardata получила значение?

bebop 24.08.2010 17:08

MyClass extends EventDispatcher:

Код AS3:

private function completeHandler(event:Event):void{ 
                        var dataXML:XML = XML(event.target.data);
                        vardata = dataXML.toXMLString();
                        dispatchEvent(new Event(Event.COMPLETE));
                }

Главный класс:
Код AS3:

private function init(e:Event = null):void 
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        tf = new TextField();
                        textf.text=" ";
                        addChild(textf);
                        var temp:MyClass = new MyClass();
                        temp.addEventListener(Event.COMPLETE, completeHandler);
 
                }
                private function completeHandler(e:Event):void
                {
                        tf.appendText((e.target as MyClass).vardata);
                }


Psycho Tiger 24.08.2010 17:14

Избегайте использования замыканий.
Код AS3:

temp.addEventListener(Event.COMPLETE, onComplete);
private function onComplete(e:Event):void{
tf1.appendText((e.currentTarget as MyClass).vardata);
}


bebop 24.08.2010 17:16

фуф, я исправился раньше чем меня исправили

Psycho Tiger 24.08.2010 17:23

У меня код правильнее =)
Если MyClass по каким-то причинам станет DisplayObject`ом и его ребёнок отправит событие Event.COMPLETE с бабблингом - то твой код даст RTE, если ребёнок не MyClass =)

P.S. знаю, что проблема высосана из пальца =)

bebop 24.08.2010 17:26

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

P.S. Работать то все равно не охота

a6279019 24.08.2010 17:26

Спасибо)

Psycho Tiger 24.08.2010 17:30

Ну, ответ от сервера синхронно никак не придёт, поэтому проверка совсем лишняя. Или ты не о том?

P.S. В точку, вообще не хочется...

bebop 24.08.2010 17:36

Тем же волшебным образом, каким объект превратится в ДисплейОбжекта, он может спрашивать данные и не у сервера :)

Psycho Tiger 24.08.2010 17:41

А, ты имеешь ввиду сделать медиатор чтобы можно было тестировать как с локальными данными, так и с серверными просто меняя флаг?
Я по setTimeout делаю, иммитирую ассинхроность загрузки =)


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

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