Config.as加载XML文件并将XML文件的内容存储在静态变量“xml”中。我试图在Main.as类中访问此变量,但它返回一个空字符串。
我认为问题在于加载过程。我试图在XML文件实际加载之前访问该变量。有什么想法吗?
public static var xml:XML; // returns null
public static var xml:XML = new XML(); //returns ""
public class Config {
public static var xml:XML = new XML();
//public static var xml:XML;
public function Config() {
loadXML("config.xml");
}
private function loadXML(url:String):void{
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, onCompleteXML);
loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
loader.load(new URLRequest(url));
}
private function onCompleteXML(e:Event):void{
xml = new XML(e.target.data);
trace("loaded");
}
private function onIOError(e:IOErrorEvent):void{
trace("Load operation failed!" + e.text);
}
public static function getXML():XML{
return Config.xml;
}
public class Main extends MovieClip {
public function Main () {
new Config();
trace(Config.xml);
trace(Config.getXML());
}
}
编辑:
public class Main extends MovieClip
{
public function Main ()
{
new Config();
}
public static function xmlHasLoaded():void
{
//now do something
trace(Config.xml);
newFunction();
}
public function newFunction():void{ //don't work
trace("new function"); //public static function newFunction():void{} works
}
}
答案 0 :(得分:0)
是的,您应该在尝试访问xml之前等待加载xml。
public class Main extends MovieClip {
public function Main () {
new Config();
}
}
public function xmlHasLoaded():void {
//now do something
trace(Config.xml.somenodename);
}
public class Config {
public static var xml:XML;
private var loader:URLLoader;
public function Config() {
loadXML("config.xml");
}
private function loadXML(url:String):void{
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, onCompleteXML);
loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
loader.load(new URLRequest(url));
}
private function onCompleteXML(e:Event):void{
xml = new XML(e.target.data);
trace("loaded"+xml);
trace(xml.somenodename);
loader.removeEventListener(Event.COMPLETE, onCompleteXML);
loader.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
loader = null;
Main.xmlHasLoaded();
}
private function onIOError(e:IOErrorEvent):void{
trace("Load operation failed!" + e.text);
loader.removeEventListener(Event.COMPLETE, onCompleteXML);
loader.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
loader = null;
}
答案 1 :(得分:0)
注意:要将所有Config变量保密,您需要创建getter和setter函数。
e.g。
在您的主要班级中:
public static var _instanceOfConfig:Config;
public class Main extends MovieClip {
public function Main () {
_instanceOfConfig = new Config();
}
}
在您的Config类中:
private var xml:XML;
//注意这不是一个静态函数,因为它需要访问xml类变量。
public function getXML():XML {
return xml;
}
public function setXML(newXML:XML):void {
xml = newXML;
}
然后,您可以使用其他课程:
import Main;
trace(Main._instanceOfConfig.getXML().somenodename);
Main._instanceOfConfig.setXML(_thenewxml);
编辑。这与声明静态函数有关。静态函数不能访问变量或显然超出其范围的方法。
试试这个。
在您的主类中,添加:
public static var _instanceOfMain:Main;
并在您的Main构造函数
中_instanceOfMain = this;
并使此功能不是静态的。
public function xmlHasLoaded():void
然后在你的Config类中:
更改Main.xmlHasLoaded();到Main._instanceOfMain.xmlHasLoaded();