2010-10-27 3 views
0

Comment puis-je obtenir des données var/data à partir d'une classe personnalisée?Obtention de données à partir de classes personnalisées (une question de POO)

La classe 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; 
     } 
    } 
} 

La classe qui appelle le 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

pas besoin de extends MovieClip dans VideoData !!! – OXMO456

Répondre

1

Je voudrais configurer un écouteur d'événement dans 'playList' et envoyer un événement de 'videoData' une fois que le XML a terminé chargement. De cette façon, vous savez quand le chargement est terminé sans utiliser ENTER_FRAME (qui utilisera beaucoup plus de CPU pour vérifier chaque image).

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; 
     } 
    } 
} 

Vous devez également capitaliser toujours vos noms de classe de la VideoData 'non 'videoData'

0

Vous êtes déjà sortir votre variable myXML privée par la méthode .getXML(). C'est le meilleur moyen d'exposer des données encapsulées à des classes extérieures. Une alternative serait de faire votre champ myXMLpublic au lieu de private, mais en utilisant les méthodes get/set accessor vous cachez votre implémentation réelle du monde extérieur.

[Modifier]

Si votre méthode getXML() retourne null, cela signifie que votre gestionnaire d'événements (la méthode processXML) n'a pas encore été appelé.

Le problème semble être dans votre constructeur VideoData:

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

Le fichier XML est probablement chargé avant vous attachez le gestionnaire d'événements, et c'est pourquoi l'événement se déclenche juste avant de commencer à écouter il. Essayez de l'inverser et de voir si cela fonctionne:

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

mais je ne peux pas obtenir les données myXML, il ne renvoie que 'null' – Hwang

+0

Avez-vous essayé d'inverser ces deux lignes? – Groo

+0

yup, mais cela n'a pas fonctionné. Est-ce que vous ne pouvez pas charger quelque chose b4 vous assigner quelque chose pour le charger? – Hwang

0

Vous aurez besoin que les données XML aient été reçues avant d'avoir une valeur. Ajoutez un _xmlLoaded booléen privé dans votre classe videoData, définissez-le sur true dans la méthode processXML.

Créer un getter

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

Maintenant, vous pouvez faire ceci:

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

solution moche ... -1 – OXMO456

+0

@ OXMO456 convenu, je préfère envoyer un événement, mais il semble apporter un autre problème ... vous avez raison cependant, compte tenu de la PO OOP, les meilleures pratiques devraient être implicites – PatrickS

Questions connexes