Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.07.2010, 11:26
Tr1te вне форума Посмотреть профиль Отправить личное сообщение для Tr1te Найти все сообщения от Tr1te
  № 11  
Ответить с цитированием
Tr1te
 
Аватар для Tr1te

Регистрация: Jun 2009
Сообщений: 461
В твоем случае естественно бред делать такую конструкцию, тебе проще дописать в конце getImagesNameFromXML ту функцию которую хочешь вызвать. Но видимо ты это будешь использовать в более глобальных местах, так что диспетчить событие в то место где нужен этот XML файл, а потом его забирать, мне кажется хорошим решением.

Добавлено через 5 минут
Цитата:
Сообщение от Котяра Посмотреть сообщение
У вас была проблема что getImagesNameFromXML был анонимной ф-цией и вне контекста данные терялись.
Ей и не нужно быть не анонимной, он к ней нигде не обращается кроме XMLData, в ней он присваивает imageNameSmall которая доступна вне загрузчика.

Старый 07.07.2010, 12:53
alexberkut вне форума Посмотреть профиль Отправить личное сообщение для alexberkut Найти все сообщения от alexberkut
  № 12  
Ответить с цитированием
alexberkut

Регистрация: Jun 2010
Адрес: Беларусь, Гродно
Сообщений: 58
Котяра, у него не работает ибо он сразу же после создания класса пытается обратить к переменной, а переменная null, ибо XML ещё не подгрузился.

Флекс - весчь асинхронная поэтому так писать нельзя. Для этого и используются ивенты.

Всё надо делать так, как написал Tr1te в 9 коменте

Старый 07.07.2010, 16:25
inMashine вне форума Посмотреть профиль Отправить личное сообщение для inMashine Найти все сообщения от inMashine
  № 13  
Ответить с цитированием
inMashine
 
Аватар для inMashine

Регистрация: Sep 2007
Сообщений: 117
Tr1te, вот что у меня получилось:
Код AS3:
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);
			}
		}	
	}
}
Как я понял при вызове конструктора XMLData, по завершении получения данных из xml, эта строка:
Код AS3:
dispatchEvent(new Event("XMLFile_loaded"));
посылает слушателю инфу, что мол загрузка завершена и можно показать эти загруженные данные, но при запуске файла не появляется никакого trace вобще.
Где я ошибся?

Старый 07.07.2010, 16:48
Tr1te вне форума Посмотреть профиль Отправить личное сообщение для Tr1te Найти все сообщения от Tr1te
  № 14  
Ответить с цитированием
Tr1te
 
Аватар для Tr1te

Регистрация: Jun 2009
Сообщений: 461
Код AS3:
			function traceSmt(event:Event):void{
				trace(imageNameSmall);
			}
Зачем внес в getImagesNameFromXML
Надо вынести. Сделать его public, это если ты его не из этого пакета вызываешь вызываешь. Но вынести надо точно, а то он у тебя только внутри getImagesNameFromXML доступен. И соответственно вызваться не может.

XMLData Не должен принадлежать к EventDispatcher, пусть будет Sprite или MovieClip.
Код AS3:
import flash.events.EventDispatcher;
Это соответственно не нужно.

Код AS3:
			dispatchEvent(new Event("XMLFile_loaded"));
			addEventListener("XMLFile_loaded", traceSmt);
Поменяй местами, на всякий случай, а то ты сначала диспетчишь событие и только потом добавляешь слушателя. Но часто и так работает, тк слушатель добавляется быстрей чем диспетчер.

Старый 07.07.2010, 17:25
Tr1te вне форума Посмотреть профиль Отправить личное сообщение для Tr1te Найти все сообщения от Tr1te
  № 15  
Ответить с цитированием
Tr1te
 
Аватар для Tr1te

Регистрация: Jun 2009
Сообщений: 461
Сделал пример с комментариями:

Главный класс:
Код AS3:
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
И класс лоудера:
Код AS3:
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
Полный вариант:
Вложения
Тип файла: rar XMLLoader_Example.rar (19.3 Кб, 35 просмотров)

Старый 07.07.2010, 17:44
inMashine вне форума Посмотреть профиль Отправить личное сообщение для inMashine Найти все сообщения от inMashine
  № 16  
Ответить с цитированием
inMashine
 
Аватар для inMashine

Регистрация: Sep 2007
Сообщений: 117
Tr1te, спасибо за помощь и комментарии - все заработало.

Добавлено через 6 минут
Вот окончательный вариант (если кому понадобится решить подобный вопрос), хотя
Tr1te и так все уже написал 10 раз))
Вот код (XMLData.as):
Код AS3:
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);
		}
	}
}
xml.xml:
Код AS3:
<?xml version="1.0" ?>
 
<imgs>
	<img first="first.jpg" second="second.jpg"></img>
</imgs>
проверять его работу нужно так же как и примеры из мануала по as3 (файлы XMLData.as и xml.xml должны лежать в одной папке).


Последний раз редактировалось inMashine; 08.07.2010 в 10:59.
Старый 07.07.2010, 17:53
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 17  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Цитата:
Сообщение от Tr1te Посмотреть сообщение
XMLData Не должен принадлежать к EventDispatcher, пусть будет Sprite или MovieClip.
А почему это не должен? Как раз он не должен быть спрайтом или клипом - это логический класс никакого интерактива в нём нет.

а FileLoader_Complete - лучше всё же вынести в приватный метод. анонимная ф-ция здесь абсолюто но не к месту.
__________________
Отряд Котовскага

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:31.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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