2009-08-14 3 views
0

Хорошо, вот что я сейчас пытаюсь сделать. У меня есть класс под названием vdata.as, который принимает 2 параметра, которые являются строками, отправленными с основного этапа. Параметр 1 - это место для файла XML, который мне нужно открыть и прочитать. Второй параметр - это имя видео, которое я сейчас ищу.AS3 вождение меня орехи

Теперь я могу получить данные из 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][email protected] == pXmlVidSrc) 
     { 
     videoData.elementArray.push(m.videos.videoname[i][email protected]); 
     videoData.elementArray.push(m.videos.videoname[i][email protected]); 
     videoData.elementArray.push(m.videos.videoname[i][email protected]); 
       } 
    } 
}   

}

Когда я вызвать его из основной стадии код выглядит следующим образом.

var xData: videoData = new videoData (xmlPath, vidSrc, this); xData.getXML();

тогда, когда я пытаюсь получить доступ к любым элементам videoData.elementArray, они появляются неопределенно ... Я просто ударил головой по моему столу, пытаясь понять это, любая помощь будет замечательной.

ответ

0

«addEventListener» не «срабатывает» ... событие происходит. Вам нужно будет добавить логическое состояние для этапа, в котором элемент elementArray был заполнен, и установить его после функции init.

Является элементом elementArray, что должно быть истинным во всех экземплярах видеоданных? Если нет, это не должно быть статическим. Вы можете использовать MovieClip (this.root) .xData для доступа к этому экземпляру класса видео из одного из ваших других классов.

Если событие завершено и массив по-прежнему пуст, то он не был заполнен вашим парсером. Вы также можете сделать проверку, чтобы увидеть, если elementArray.length> 0.

EDIT в ответ на комментарий:

в качестве общественного элемента или предпочтительно свойство только для чтения сделать булевой переменной:

var parseComplete:Boolean; 

Установите его в false в своем конструкторе.

Затем, после вызова "Init" в вашем Event.COMPLETE набор обратного вызова:

parseComplete=true; 

Затем убедитесь, что parseComplete == верно, прежде чем когда-либо доступ к elementArray. Если вы ждете парсера, чтобы завершить вы можете установить тайм-аут или какое-то примерочный механизм/поймать только в случае, если есть какие-либо непредвиденные ошибки, которые могут вызвать какое-то:

while(!xData.parseComplete) { } 

Для цикла на неопределенное время , Все зависит от использования. Лично я, вероятно, добавлю обратный вызов из прослушивателя событий на сцену, чтобы вызвать все, что должно произойти дальше.

+0

Спасибо. Извините, что я боюсь, но могу ли я привести пример того, что вы подразумеваете под «добавлением логического состояния для сцены». Думаю, у меня есть идея, но я просто хочу убедиться. И ни один элементArray не должен быть правдой, я просто удалил статический текст из этого. – 2Alpha

+0

спасибо, что получил. – 2Alpha

+0

сделал это трюк? – McAden

1

Почему elementArray является статическим var, вам нужно только сделать его общедоступным, чтобы использовать его вне функции.

Я довольно запутанный, но вы можете попробовать инструмент для отладки, например «De MonsterDebugger», я бы начал с трассировки xmlloader.data в функции parseXMLData.

+0

В основном, что его должно сделать, это получить данные XML, дамп их в массив и вернуть его на основной этап, чтобы я мог использовать его еще в приложении.Но в настоящее время он не работает. Как я уже сказал, я вижу данные в классе, но не могу просмотреть его на главном этапе. На самом деле я даже не вижу его после пожара. Я проверю отладчика и посмотрю, с чем это связано. – 2Alpha