访问静态变量返回空字符串

时间:2013-04-23 06:59:34

标签: xml actionscript-3 flash load static-members

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

2 个答案:

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