Получение данных из пользовательских классов (вопрос ООП) - PullRequest
0 голосов
/ 27 октября 2010

Как я могу получить некоторые 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())
       }
    }
}

Ответы [ 3 ]

1 голос
/ 27 октября 2010

Я бы настроил прослушиватель событий в 'playList' и отправил бы Событие из 'videoData', как только 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;
       }
    }
}

Вы также ВСЕГДА должны использовать заглавные буквы VideoData для имен ваших классов'not' videoData '

0 голосов
/ 27 октября 2010

Вам потребуется, чтобы данные XML были получены до получения значения. Добавьте приватный логический _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 голосов
/ 27 октября 2010

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

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

[Edit]

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

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

   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"));
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...