2010-10-27 3 views
0

Как я могу получить некоторые var/data из пользовательских классов?Получение данных из пользовательских классов (вопрос ООП)

XML-класс

package classes 
{ 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 
    import flash.events.Event; 
    import flash.display.MovieClip; 

    public class videoData extends MovieClip 
    { 
     private var myXML:XML; 
     private var myXMList:XMLList; 

     public function videoData() 
     { 
      var myXMLLoader:URLLoader = new URLLoader(); 
      myXMLLoader.load(new URLRequest("playlist.xml")); 
      myXMLLoader.addEventListener(Event.COMPLETE, processXML); 
     } 

     private function processXML(e:Event):void 
     { 
      myXML = new XML(e.target.data); 
      myXMList = new XMLList(myXML.children()); 
     } 

     public function getXML() 
     { 
      return myXML; 
     } 
    } 
} 

Класс, который называет XML

package classes 
{ 
    import flash.display.MovieClip; 
    import flash.events.MouseEvent; 
    import classes.videoData; 

    public class playList extends MovieClip 
    { 
     private var vData:videoData = new videoData(); 

     public function playList() 
     { 
      trace(vData.getXML()) 
     } 
    } 
} 
+0

нет необходимости в расширяет MovieClip в видеоданном !!! – OXMO456

ответ

1

Я хотел бы настроить приемник событий в «PLAYLIST» и отправляет событие из «видеоданных» после того, как XML закончило погрузка. Таким образом, вы знаете, когда закончите загрузку, не используя ENTER_FRAME (который будет использовать больше ЦП в качестве проверки каждого кадра).

package classes 
{ 
    import flash.events.*; 
    import flash.display.MovieClip; 
    import classes.VideoData; 

    public class PlayList extends MovieClip 
    { 
     private var vData:VideoData; 

     public function PlayList() 
     { 
      vData = new VideoData(); 
      vData.addEventListener(Event.COMPLETE, onXMLCompleteHandler); 
     } 

     private function onXMLCompleteHandler(e:Event):void 
     { 
      vData.removeEventListener(Event.COMPLETE, onXMLCompleteHandler); 
      trace(vData.getXML()); 
     } 
    } 
} 

package classes 
{ 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 
    import flash.events.Event; 
    import flash.display.MovieClip; 

    public class VideoData extends MovieClip 
    { 
     private var myXML:XML; 
     private var myXMList:XMLList; 
     private var myXMLLoader:URLLoader; 

     public function VideoData() 
     { 
      myXMLLoader = new URLLoader(); 
      myXMLLoader.load(new URLRequest("playlist.xml")); 
      myXMLLoader.addEventListener(Event.COMPLETE, processXML); 
     } 

     private function processXML(e:Event):void 
     { 
      myXMLLoader.removeEventListener(Event.COMPLETE, processXML); 
      myXML = new XML(e.target.data); 
      myXMList = new XMLList(myXML.children()); 
      dispatchEvent(e); 
     } 

     public function getXML():XML 
     { 
      return myXML; 
     } 
    } 
} 

Вы также должны всегда прописные букв своих имен класса «видеоданные» не «видеоданная»

0

Вы уже получаете вашу личную myXML переменную через метода .getXML(). Это лучший способ предоставить инкапсулированные данные для внешних классов.

Альтернативой было бы сделать поле myXMLpublic вместо private, но с использованием методов get/set Accessor вы скрываете свою фактическую реализацию из внешнего мира.

[Редактировать]

Если ваш метод getXML() возвращается нуль, то это означает, что ваш обработчик событий (метод processXML) еще не был вызван.

Проблема, как представляется, в конструкторе видеоданного:

public function videoData() 
    { 
     var myXMLLoader:URLLoader = new URLLoader(); 
     myXMLLoader.load(new URLRequest("playlist.xml")); 
     myXMLLoader.addEventListener(Event.COMPLETE, processXML); 
    } 

Файл XML, вероятно, нагруженный перед тем Вы придаете обработчик события, и именно поэтому срабатывает событие непосредственно перед началом слушать Это. Попробуйте обратить вспять его и посмотреть, работает ли оно:

public function videoData() 
    { 
     var myXMLLoader:URLLoader = new URLLoader(); 
     myXMLLoader.addEventListener(Event.COMPLETE, processXML); // moved up 
     myXMLLoader.load(new URLRequest("playlist.xml")); 
    } 
+0

, но я не могу получить данные myXML, он возвращает только «null» – Hwang

+0

Вы пытались изменить эти две строки? – Groo

+0

yup, но это не сработало. Разве вы не можете загрузить что-то b4, вы назначили что-то для его загрузки? – Hwang

0

Для получения данных XML вам необходимо будет получить данные XML. Добавьте частный Boolean _xmlLoaded в свой класс videoData, установите значение true в методе processXML.

Создать геттер

public function get xmlLoaded():Boolean 
{ 
    return _xmlLoaded; 
} 

Теперь вы можете сделать это:

private var data:videoData = new videoData(); 
private var xmlData:XML; 

private function init():void 
{ 
    addEventListener(Event.ENTER_FRAME , xmlLoaded); 
} 

private function xmlLoaded(event:Event):void 
{ 
    if(videoData.xmlLoaded) 
    { 
    xmlData = videoData.getXML(); 
    removeEventListener(Event.ENTER_FRAME , xmlLoaded); 
    } 
} 
+0

Уродливое решение ... -1 – OXMO456

+0

@ OXMO456 согласился, я бы скорее отправил событие, но он, похоже, принес еще один вопрос ... вы правы, хотя, учитывая ОП, упомянутый ООП, должна быть указана лучшая практика – PatrickS