Форум 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=141876)

inMashine 07.07.2010 10:45

как использовать Event.COMPLETE
 
Добрый день.
Есть код, который вытаскивает данные из xml файла, используя прослушивание события "Event.COMPLETE":

Код AS1/AS2:

package
{
    import flash.display.Loader;
    import flash.net.URLRequest;
    import flash.net.URLLoader;
    import flash.events.Event;
 
        public class XMLData
        {
                public var xml:String = "xml.xml";
                public var xmlLoader:URLLoader =  new URLLoader(new URLRequest(xml));
                public var xmlData:XML;
                public var xmlList:XMLList;
                public var imageNameSmall:String;
                public var imageNameBig:String;
 
                public function XMLData():void
                {
                        xmlLoader.addEventListener(Event.COMPLETE, getImagesNameFromXML);
 
                        function getImagesNameFromXML(event:Event):void {
                                xmlData = XML(event.target.data);
                                xmlList = xmlData.children();
                                imageNameSmall = xmlList[0].attributes()[0];
                                imageNameBig = xmlList[0].attributes()[1];
                                // trace(imageNameSmall );
                        }       
                }
 
                public function traceSmt():void{
                        trace(imageNameSmall);
                }
        }
}

Теперь если попытаться обратиться к методу traceSmt():
Код AS1/AS2:

var my_mc:XMLData = new XMLData();
my_mc.traceSmt();

то получим
Код AS3:

null

Однако если раскомментировать сторку
Код AS3:

  // trace(imageNameSmall );

то нужное значение выведится на экран.
То есть мы получаем данные из xml файла, а передать их куда либо не можем - можем пользоваться ими только непосредственно в конце конструктора XMLData.
Подскажите плз что надо сделать что бы
Код AS3:

 my_mc.traceSmt();

выдавал не null.

Tr1te 07.07.2010 10:50

А где у тебя функция getImagesNameFromXML которую ты вызываешь после Complete?

inMashine 07.07.2010 10:54

сори - опечатка
она ниже строчкой

Котяра 07.07.2010 10:57

вынеси getImagesNameFromXML как метод класса XMLData.
Код AS3:

package
{
    import flash.display.Loader;
    import flash.net.URLRequest;
    import flash.net.URLLoader;
    import flash.events.Event;
 
        public class XMLData
        {
                public var xml:String = "xml.xml";
                public var xmlLoader:URLLoader =  new URLLoader(new URLRequest(xml));
                public var xmlData:XML;
                public var xmlList:XMLList;
                public var imageNameSmall:String;
                public var imageNameBig:String;
 
                public function XMLData():void
                {
                        xmlLoader.addEventListener(Event.COMPLETE, getImagesNameFromXML);
                      // а загрузка где? наверное так?
                        xmlLoader.load(new URLRequest(xml));
 
                }
 
                private function getImagesNameFromXML(event:Event):void {
                                xmlData = XML(event.target.data);
                                xmlList = xmlData.children();
                                imageNameSmall = xmlList[0].attributes()[0];
                                imageNameBig = xmlList[0].attributes()[1];
                                // trace(imageNameSmall );
                }
 
                public function traceSmt():void{
                        trace(imageNameSmall);
                }
        }
}


Tr1te 07.07.2010 10:58

Скорей всего твоя проблема в том что ты traceSmt вызываешь до того как XML успел загрузиться.

Поставь traceSmt (); в конец функции getImagesNameFromXML, все будет в порядке. То есть он ее вызовет, когда уже XML загрузится, и присвоит переменную imageNameSmall.

Добавлено через 1 минуту
Выносить ничего не надо, это не повлияет, главное что imageNameSmall у тебя вынесено в общие переменные и ты можешь к нему обратиться.

inMashine 07.07.2010 11:00

Котяра, пробовал - не работает.


Tr1te, так и есть. Я об этом писал в первом посте.
Получается что мы получаем данные из xml файла, а передать их куда либо не можем.

Я думаю это от нехватки опыта, если кто сталкивался с этим - наверняка есть пути решения.

Tr1te 07.07.2010 11:02

Ну естественно не повлияет, все зависит от того когда ты вызываешь imageNameSmall. Если до загрузки, то он равен NULL, если после присвоения, то равен тому что присвоил.

Добавлено через 8 минут
Ну конечно мы можем их использовать и из других функций, просто вызывать их нужно после того как загрузил, и не обязательно в конце конструктора XMLData.

Добавлено через 11 минут
Например, если я загружаю хмл файл, я обращаюсь к загрузчику, скачай мне тото. Он загружает, и после завершения говорит тому кто просил: "я загрузил". И после этого я беру XML, из загрузчика, и делаю с ним что хочу.

inMashine 07.07.2010 11:15

Код AS3:

просто вызывать их нужно после того как загрузил, и не обязательно в конце конструктора XMLData.

Если вызывать не в конце конструктора XMLData, то для флеша это означает, что он их еще не загрузил.

Код AS3:

Он загружает, и после завершения говорит тому кто просил: "я загрузил".

Можете это написать кодом?

Tr1te 07.07.2010 11:22

Код AS3:

                public function NW_XMLLoader(Server:int,FileID:int) {
 
                        var FileLoader:URLLoader=new URLLoader(new URLRequest(URL_Path));
                        FileLoader.addEventListener(Event.COMPLETE,FileLoader_Complete);
 
                        function FileLoader_Complete(e:Event):void {
                                FileLoader.removeEventListener(Event.COMPLETE,FileLoader_Complete);
                                XMLFile=XML(e.currentTarget.data);
 
                                parent.dispatchEvent(new Event("XMLFile_Loaded"));
                        }
 
                }

Я диспетчу тому кто просил загрузить файл. После чего просящий может его забрать. В твоем случае можно вызвать функцию traceSmt.

В конце getImagesNameFromXML допиши:
Код AS3:

dispatchEvent(new Event("XMLFile_Loaded"));

Добавь слушателя:
Код AS3:

addEventListener("XMLFile_Loaded",noname);

И добавь функцию:
Код AS3:

function noname(e:Event):void {
traceSmt();
}


Котяра 07.07.2010 11:25

У вас была проблема что getImagesNameFromXML был анонимной ф-цией и вне контекста данные терялись.
при вынесении этой ф-ции в метод - всё должно работать.
Также в вашем коде не было
Код AS3:

xmlLoader.load(new URLRequest(xml));

Цитата:

Котяра, пробовал - не работает.
Что именно не работает?


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

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