![]() |
|
||||||||||
|
|||||
|
Регистрация: Jun 2009
Сообщений: 461
|
В твоем случае естественно бред делать такую конструкцию, тебе проще дописать в конце getImagesNameFromXML ту функцию которую хочешь вызвать. Но видимо ты это будешь использовать в более глобальных местах, так что диспетчить событие в то место где нужен этот XML файл, а потом его забирать, мне кажется хорошим решением.
Добавлено через 5 минут Ей и не нужно быть не анонимной, он к ней нигде не обращается кроме XMLData, в ней он присваивает imageNameSmall которая доступна вне загрузчика. |
|
|||||
|
Регистрация: Jun 2010
Адрес: Беларусь, Гродно
Сообщений: 58
|
Котяра, у него не работает ибо он сразу же после создания класса пытается обратить к переменной, а переменная null, ибо XML ещё не подгрузился.
Флекс - весчь асинхронная поэтому так писать нельзя. Для этого и используются ивенты. Всё надо делать так, как написал Tr1te в 9 коменте |
|
|||||
|
Регистрация: Sep 2007
Сообщений: 117
|
Tr1te, вот что у меня получилось:
package { import flash.display.Loader; import flash.net.URLRequest; import flash.net.URLLoader; import flash.events.Event; import flash.events.EventDispatcher; public class XMLData extends EventDispatcher { 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); } public function getImagesNameFromXML(event:Event):void { xmlLoader.removeEventListener(Event.COMPLETE, getImagesNameFromXML); xmlData = XML(event.target.data); xmlList = xmlData.children(); imageNameSmall = xmlList[0].attributes()[0]; imageNameBig = xmlList[0].attributes()[1]; dispatchEvent(new Event("XMLFile_loaded")); addEventListener("XMLFile_loaded", traceSmt); function traceSmt(event:Event):void{ trace(imageNameSmall); } } } } Где я ошибся? |
|
|||||
|
Регистрация: Jun 2009
Сообщений: 461
|
Зачем внес в getImagesNameFromXML
Надо вынести. Сделать его public, это если ты его не из этого пакета вызываешь вызываешь. Но вынести надо точно, а то он у тебя только внутри getImagesNameFromXML доступен. И соответственно вызваться не может. XMLData Не должен принадлежать к EventDispatcher, пусть будет Sprite или MovieClip. Это соответственно не нужно. Поменяй местами, на всякий случай, а то ты сначала диспетчишь событие и только потом добавляешь слушателя. Но часто и так работает, тк слушатель добавляется быстрей чем диспетчер. |
|
|||||
|
Регистрация: Jun 2009
Сообщений: 461
|
Сделал пример с комментариями:
Главный класс: package Scr{ import flash.display.*; import flash.events.*; public class E_Stage extends MovieClip { //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- Var public var XL:XMLLoader;//Создаю переменную для лоудера. //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- XL_Stage public function E_Stage():void { addEventListener("XMLFile_Loaded",TraceLoadedXML);// создаю слушателя которые //ждет когда лоудер скажет что загрузил файл. XL=new XMLLoader();//Создаю инстанс лоудера. addChild(XL);//Добавляю мой инстанс лоудера на сцену, чтобы работать со свойствами/методами лоудера. } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- TraceLoadedXML private function TraceLoadedXML(e:Event):void {// Дождался когда лоудер загрузил файл сообщил это мне, и... var LoadedXML:XML=XL.XMLFile;//вытаскиваю из лоудера то что он сохранил в отдельный файл. trace(LoadedXML);//Трейсю файл уже от сюда, и лоудер мне больше не нужен, могу делать с ним что захочу. removeChild(XL);//Убиваю инстанс лоудера, если тебе нужно часто чтото загружать, то лучше XL=null;//его не убивать, а использовать повторно. } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- }//class }//package package Scr{ //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- import flash.display.*; import flash.events.*; import flash.net.*; //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- public class XMLLoader extends Sprite { //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- Vars public var XMLFile:XML=new XML(); //Эта переменная в которую я сохраню то что загрузил. //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- XMLLoader public function XMLLoader():void { var URL_Path:String="crossdomain.xml"; 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")); //Сообщаю родителю, что я загрузил файл, можешь забирать. //Родителем может быть кто угодно. } } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- }//class }//package |
|
|||||
|
Регистрация: Sep 2007
Сообщений: 117
|
Tr1te, спасибо за помощь и комментарии - все заработало.
Добавлено через 6 минут Вот окончательный вариант (если кому понадобится решить подобный вопрос), хотя Tr1te и так все уже написал 10 раз)) Вот код (XMLData.as): package { import flash.display.Loader; import flash.display.Sprite; import flash.net.URLRequest; import flash.net.URLLoader; import flash.events.Event; public class XMLData extends Sprite { 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); } public function getImagesNameFromXML(event:Event):void { xmlLoader.removeEventListener(Event.COMPLETE, getImagesNameFromXML); xmlData = XML(event.target.data); xmlList = xmlData.children(); imageNameSmall = xmlList[0].attributes()[0]; imageNameBig = xmlList[0].attributes()[1]; addEventListener("XMLFile_loaded", traceSmt); dispatchEvent(new Event("XMLFile_loaded")); } public function traceSmt(event:Event):void{ trace(imageNameSmall); } } } проверять его работу нужно так же как и примеры из мануала по as3 (файлы XMLData.as и xml.xml должны лежать в одной папке). Последний раз редактировалось inMashine; 08.07.2010 в 10:59. |
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
Цитата:
а FileLoader_Complete - лучше всё же вынести в приватный метод. анонимная ф-ция здесь абсолюто но не к месту.
__________________
Отряд Котовскага |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:31. |
|
|
« Предыдущая тема | Следующая тема » |
|
|