0

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

2 回答 2

0

注意:要使所有 Config 变量保持私有,您需要创建 getter 和 setter 函数。

例如

在您的主要课程中:

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();

于 2013-04-23T10:50:04.060 回答
0

是的,您应该等待 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;
}
于 2013-04-23T07:24:33.727 回答