如何从自定义类中获取一些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 :(得分:1)
我会在'playList'中设置一个事件监听器,并在XML加载完成后从'videoData'调度一个Event。这样你就知道它什么时候没有使用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;
}
}
}
您还应该始终将您的班级名称'VideoData'大写,而不是'videoData'
答案 1 :(得分:0)
您已通过myXML
方法获取私有.getXML()
变量。这是将封装数据公开给外部类的最佳方法。
另一种方法是使您的myXML
字段public
代替private
,但使用get / set访问器方法,您将隐藏外部世界的实际实现。
[编辑]
如果您的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"));
}
答案 2 :(得分: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 );
}
}