2010-10-27 51 views
0

如何從自定義類中獲取某些var/data?從自定義類中獲取數據(OOP問題)

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

無需擴展影片剪輯的可視數據! – OXMO456 2010-10-27 12:03:36

回答

1

我會設置在「播放列表」事件偵聽器,並分派從「可視數據」事件一旦XML已完成加載。這樣你就知道什麼時候完成加載而不使用ENTER_FRAME(它會在檢查每一幀時使用更多的CPU)。

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

您已經通過.getXML()方法讓你的私人myXML變了。這是將封裝數據暴露給外部類的最好方法。

另一種方法是使myXML字段public而不是private,但使用get/set存取器方法,你隱藏你的外部世界的實際實現。

[編輯]

如果您getXML()方法返回null,這意味着你的事件處理程序(該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 2010-10-27 08:29:24

+0

您是否嘗試顛倒這兩條線? – Groo 2010-10-27 13:40:31

+0

是的,但它沒有奏效。難道你不能加載一些東西給你分配一些東西來加載嗎? – Hwang 2010-10-28 03:02:25

0

在獲取值之前,您需要先收到XML數據。 在您的videoData類中添加一個私有布爾_xmlLoaded,在processXML方法中將其設置爲true。

創建一個getter

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 2010-10-27 12:06:00

+0

@ OXMO456同意,我寧願發送一個事件,但它似乎帶來另一個問題......你說得對,但考慮到OP提到的OOP,應該暗示最佳實踐 – PatrickS 2010-10-27 12:57:14

相關問題