1

我刚刚开始探索包的使用。我希望函数的结果(作为变量“myXML”)可用于代码的其他元素。我想知道创建一个新的类文件是否可行。例如:

package  
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLLoader;
    import flash.net.URLRequest;    

    public class XMLLoad 
    {
        public var myXML:XML;
        public var myLoader:URLLoader = new URLLoader();
        myLoader.load(new URLRequest("http://myWebsite/myFile.xml"));
        myLoader.addEventListener(Event.COMPLETE, processXML);

        public function processXML(e:Event):void 
        {
            myXML = new XML(e.target.data);
            trace(myXML);
        }

    }

}

这是创建全局变量的好方法吗?如果是这样,在 FLA 文件中,我将如何访问/使用保存 XML 数据的 var“myXM”?

import XMLLoad;
XMLLoad();
?

非常感谢。

4

3 回答 3

2

您在课堂上所做的几乎都完成了,但是有一些事情需要纠正:

首先,在类减速的顶层中,您只能定义成员(属性和方法)。目前你正在做的事情很好,但你也试图在这个范围内运行一些实际的代码:

myLoader.load(new URLRequest("http://myWebsite/myFile.xml"));
myLoader.addEventListener(Event.COMPLETE, processXML);

这将抛出错误,您的课程将无法运行。要在创建类的实例时立即运行代码,您需要使用 a constructor,它是一个与在其中声明的类同名的函数(区分大小写)。将其转换为代码将如下所示,您会注意到我已经创建了构造函数并将罪魁祸首代码放入其中:

public class XMLLoad 
{

    public var myXML:XML;
    public var myLoader:URLLoader = new URLLoader();


    // This is the constructor.
    public function XMLLoad()
    {
        myLoader.load(new URLRequest("http://myWebsite/myFile.xml"));
        myLoader.addEventListener(Event.COMPLETE, processXML);
    }


    public function processXML(e:Event):void 
    {
        myXML = new XML(e.target.data);
        trace(myXML);
    }

}

您现在所做的是创建了一个类XMLLoad。使用new关键字,您可以创建该类的实例。在您的情况下,您只需要一个实例来执行您想要的操作,如下所示:

var xmlLoad:XMLLoad = new XMLLoad();

这将创建一个实例XMLLoad并将其分配给变量xmlLoad,通过它您将能够访问您在该类中定义的属性和方法。我们在上面创建的构造函数也将自动运行,这意味着您的类已经发起了对某些 XML 的请求。

不幸的是,由于对外部数据的请求是异步的(也就是说,它们在与您的应用程序的自然流程不同的时间线上执行),我们无法判断 XML 何时完全加载并且我们能够从外部使用它班级。然而,我们可以做的是XMLLoad稍微改变类来帮助我们:

public class XMLLoad 
{

    public var myXML:XML;
    public var myLoader:URLLoader = new URLLoader();
    private var _callback:Function;

    public function XMLLoad(callback:Function)
    {
        _callback = callback;
        myLoader.load(new URLRequest("http://myWebsite/myFile.xml"));
        myLoader.addEventListener(Event.COMPLETE, processXML);
    }

    public function processXML(e:Event):void 
    {
        myXML = new XML(e.target.data);
        _callback(myXML);
    }

}

我们在这里所做的是修改构造函数以接受对函数的引用,该函数应该接受 type 的参数XML。然后我们修改了您的processXML函数以执行回调并将接收到的 XML 发送给它。这意味着您现在可以这样做:

var xmlLoad:XMLLoad = new XMLLoad(done);

function done(xml:XML):void
{
    trace(xml);
}

这意味着您将能够在该函数中继续您的应用程序,该done函数将为您提供完全加载的 XML。

于 2012-09-12T05:15:24.710 回答
2
  1. 创建一个名为“Variables.as”的类

  2. 它里面的代码是这样的(注意:没有函数,只有变量):

    // Define these variables in the normal place where you would 
    // define them in an AS3 class/package
    
    public static var enabled:Boolean = false;
    public static var configXMLData:XML;
    
  3. 用法,导入 Variables.as 并使用 Variables.enable = true 或 trace(Variables.enable) 等调用和设置。将所需变量添加到公共静态 var 列表中。

  4. XML 加载可以在外部类或您的主应用程序中完成。听起来你对 AS3 不太了解(无意冒犯),所以我现在就让它保持简单,并将它放在你的主要课程中。所有代码辅助都在 Adob​​e Live Docs 中(谷歌搜索时有一些关键字供您使用),例如。AS3 LoadXML 谷歌会给你很多例子。注意设置、加载、加载完成、获取数据是你想要的流程。因此,只有在调用 onComplete 函数后,您才能继续使用您的应用程序。

  5. 一旦你的 XML 被加载谷歌起来 AS3 E4X 解析。这是一个巨大的主题,您可以在其中使用用于 AS3 的 XML E4X 检索属性和节点内容的值。您需要参考示例并不难。还有一种旧方法是 XML List,您可以找到文档和示例 Adob​​e Live Docs xmlList。一旦您对此有足够的了解,您就可以随意在 Class 文档 Variables.as 中设置变量。无论您在哪里需要它们,您只需在任何您想要的类中调用 Variables.enable。

于 2012-09-12T01:18:03.330 回答
2

Marty Wallace 的回答涵盖了让您的问题得到解答和发挥作用所需知道的一切。不过,我要补充一点,由于您试图将这些变量设为全局,因此存在一个危险的陷阱。

危险在于,每次调用 时new,都会获得变量的新实例。很容易意外地创建两组或更多组全局变量,每组都具有不同的值。

有两种解决方案:仅使用static变量,或者将类编写为单例。

第一个更简单,只需将static关键字添加到变量中,并记住使用XMLLoad.variable_name 引用它们,而不是创建新实例。

public class XMLLoad {
    public static var myXML:XML;
    public static var myLoader:URLLoader = new URLLoader();
    private static var _callback:Function;

    public static function loadXML(callback:Function):void
    {
        _callback = callback;
        myLoader.load(new URLRequest("http://myWebsite/myFile.xml"));
        myLoader.addEventListener(Event.COMPLETE, processXML);
    }

    public function processXML(e:Event):void 
    {
        myXML = new XML(e.target.data);
        _callback(myXML);
    }
}

然后,再次向 Marty 借用:

XMLLoad.loadXML(done);

function done(xml:XML):void {
    trace(xml);
}

这很好,但在更复杂的情况下会变得有点罗嗦和混乱。另一方面,单例以相同的方式工作,但表现得就像一个普通的类。虽然内部工作可能更复杂一些。

public class XMLLoad {
    /**
     *  A static variable that holds the actual instance of the class.
     **/
    private static var instance:XMLLoad;

    public var myXML:XML;

    /**
     *  An initialization method that replaces the constructor and creates
     *      (if it didn't already exists) and returns the instance for external
     *      use.
     **/
    public static function GetLoader():XMLLoad {
        if (!instance) {
            instance = new XMLLoad;
        }
        return instance;
    }

    public function loadXML(callback:Function):void {
        _callback = callback;
        myLoader.load(new URLRequest("http://myWebsite/myFile.xml"));
        myLoader.addEventListener(Event.COMPLETE, processXML);
    }

    private function processXML(e:Event):void {
        myXML = new XML(e.target.data);
        _callback(myXML);
    }
}

对此类的调用如下所示:

var xmlLoader:XMLLoad = XMLLoad.GetLoader();
xmlLoader.loadXML(done);

function done(xml:XML):void {
    trace(xml);
}
于 2012-09-12T13:58:55.510 回答