AS3 сводит меня с ума
Хорошо, вот что я сейчас пытаюсь сделать. У меня есть класс с именем vdata.as, который принимает 2 параметра, и это строки, отправленные с главной сцены. Первый параметр - это местоположение файла XML, который мне нужно открыть и прочитать. Второй параметр - это название видео, которое я сейчас ищу.
Теперь я могу получить данные из файла XML и отобразить их без каких-либо проблем, если они вызваны из моего класса, но когда я пытаюсь получить доступ к любому из них со стадии, я получаю неопределенную.
import flash.net.*;
import flash.display.*;
import flash.events.*;
public class videoData
{
private var mName:String;
private var mLink:String;
private var mCategory:String;
public static var elementArray:Array;
// Constructor
public function videoData(xmlPath:String,xmlVidSrc:String,pMC:MovieClip)
{
pXmlPath = xmlPath;
pXmlVidSrc = xmlVidSrc;
xmlloader = new URLLoader();
elementArray = new Array();
}
public function getXML()
{
XMLData();
}
private function XMLData()
{
xmlloader.load(new URLRequest(pXmlPath));
xmlloader.addEventListener(Event.COMPLETE,parseXMLData);
}
private function parseXMLData():void
{
var x:XML = new XML(xmlloader.data);
Init(x);
}
private function Init(m:XML):*
{
var i:Number;
for(i=0; i<m.videos.videoname.length(); i++)
{
if(m.videos.videoname[i].@name == pXmlVidSrc)
{
videoData.elementArray.push(m.videos.videoname[i].@name);
videoData.elementArray.push(m.videos.videoname[i].@category);
videoData.elementArray.push(m.videos.videoname[i].link.@url);
}
}
}
}
Когда я называю это с основного этапа, код выглядит следующим образом.
var xData: videoData = new videoData (xmlPath, vidSrc, this); xData.getXML ();
затем, когда я пытаюсь получить доступ к любым элементам videoData.elementArray, они появляются неопределенно... Я просто бью себя по столу, пытаясь понять, что любая помощь будет хорошей.
2 ответа
"addEventListener" не "запускает"... событие делает. Вам нужно будет добавить логическое значение для состояния заполнения элемента elementArray и установить его после функции init.
Является ли elementArray верным для всех экземпляров videoData? Если нет, он не должен быть статичным. Вы можете использовать MovieClip(this.root).xData для доступа к этому экземпляру класса видео из одного из ваших других классов.
Если событие завершилось, а массив все еще пуст - тогда он не был заполнен вашим анализатором. Вы также можете проверить, является ли elementArray.length > 0.
РЕДАКТИРОВАТЬ в ответ на комментарий:
в качестве открытого члена или предпочтительно свойства только для чтения сделайте логическую переменную:
var parseComplete:Boolean;
Установите значение false в вашем конструкторе.
Затем, после вашего вызова "Init" в вашем наборе обратного вызова Event.COMPLETE:
parseComplete=true;
Затем убедитесь, что parseComplete == true, прежде чем вы получите доступ к elementArray. Если вы ожидаете завершения работы парсера, вы можете установить тайм-аут или какой-то механизм try/catch на случай, если возникнут непредвиденные ошибки, которые могут вызвать что-то вроде:
while( !xData.parseComplete ) { }
Зацикливаться до бесконечности. Все зависит от использования. Лично я, вероятно, добавлю обратный вызов от слушателя событий на сцену, чтобы вызвать то, что должно произойти дальше.
Почему elementArray - статическая переменная, вам нужно только сделать ее общедоступной, чтобы использовать ее вне функции.
Я довольно запутанный, но вы можете попробовать инструмент отладки, такой как "De MonsterDebugger", я бы начал с отслеживания xmlloader.data в функции parseXMLData.