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

时间:2012-09-12 00:56:42

标签: 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();
?

非常感谢。

3 个答案:

答案 0 :(得分: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一点都不太了解(没有冒犯),所以我现在就把它简单化,并把它放在你的主要课堂上。所有代码助手都在Adobe Live Docs中(在谷歌搜索时为您提供一些关键字),例如。 AS3 LoadXML googles将为您提供大量示例。注意设置,加载,加载完成,获取数据是您想要的流程。因此,只有在调用onComplete函数后才能继续执行应用程序。

  5. 加载XML后,Google AS3 E4X解析。这是一个很大的主题,您可以使用XML E4X for AS3检索属性和节点内容的值。你需要提供的例子并不难。还有一种旧方法,即XML List,您可以找到文档和示例Adobe Live Docs xmlList。一旦你对此有了足够的了解,你就可以随意在Class文档Variables.as中设置Variables。无论你需要它们,你只需在你想要的任何类中调用Variables.enable。

答案 1 :(得分:2)

你班上所做的几乎就在那里,但有一些事情需要纠正:

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

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。

答案 2 :(得分:2)

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

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

有两种解决方案:仅使用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);
}