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.

Другие вопросы по тегам