【问题标题】:Accessing static variable returns empty string访问静态变量返回空字符串
【发布时间】:2013-04-23 06:59:33
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    注意:要使所有 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();

    【讨论】:

    • 我想你没有理解我的问题。再次查看已编辑的帖子。实际代码抛出错误:“调用可能未定义的方法 newFunction”。如果我在函数声明中使用“静态”关键字,它就可以工作。这意味着我必须将 XML 文件加载后的所有方法声明为静态方法。会不会是另一种方式?
    • 我必须将加载 XML 文件后的所有方法声明为静态。为什么?
    【解决方案2】:

    是的,您应该等待 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;
    }
    

    【讨论】:

    • 谢谢,它有效。只需澄清一点:您忘记了函数定义中的静态关键字“public function xmlHasLoaded():void”。
    • 最后一个问题。比如说我在我的代码中有这个......(查看主帖)。除非我将函数定义为静态,否则它会给我一个错误。我想使用 Config.as 类来托管来自整个应用程序的全局变量,这些变量是从 XML 文件中获取的。一个简单的解决方案是显式声明公共所有变量,但我对这个想法不太满意。不是另一种方式吗?
    猜你喜欢
    • 2013-09-18
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 2012-03-11
    相关资源
    最近更新 更多