需要一些帮助来理解包在AS3中的使用

  • 本文关键字:AS3 帮助 xml actionscript-3
  • 更新时间 :
  • 英文 :


我刚刚开始探索包的使用。我希望函数的结果(作为变量"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();
?

非常感谢。

你在课堂上所做的几乎已经完成,但有一些事情需要纠正:

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

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

这将引发错误,并且您的类将无法运行。要在创建类的实例时立即运行代码,您需要使用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);
    }
}

我们在这里所做的是修改构造函数以接受对函数的引用,该函数应该接受类型为XML的参数。然后我们修改了您的processXML函数来执行回调并将接收到的XML发送到它

var xmlLoad:XMLLoad = new XMLLoad(done);
function done(xml:XML):void
{
    trace(xml);
}

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

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

然后,再次借用马蒂的话:

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);
}
  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了解不多(无意冒犯),所以我现在只想简单一点,把它放在你的主课上。所有的代码辅助都在Adobe Live Docs中(谷歌搜索时会有一些关键词),例如AS3 LoadXML谷歌会给你很多例子。请注意,设置、加载、加载完成、获取数据是您想要的流程。因此,只有在调用onComplete函数后,才能继续使用您的应用程序。

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

最新更新