我刚刚开始探索包的使用。我希望函数的结果(作为变量"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);
}
-
创建一个名为"Variables.as"的类
-
里面的代码是这样的(注意:没有函数,只有变量):
// 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;
-
用法,导入Variables.as,然后使用Variables.enable=true或trace(Variables.enable)等进行调用和设置。添加到所需变量的公共静态var列表中。
-
XML加载可以在外部类或主应用程序中完成。听起来你对AS3了解不多(无意冒犯),所以我现在只想简单一点,把它放在你的主课上。所有的代码辅助都在Adobe Live Docs中(谷歌搜索时会有一些关键词),例如AS3 LoadXML谷歌会给你很多例子。请注意,设置、加载、加载完成、获取数据是您想要的流程。因此,只有在调用onComplete函数后,才能继续使用您的应用程序。
-
一旦你的XML加载谷歌AS3 E4X解析。这是一个巨大的主题,您可以使用XMLE4XforAS3检索属性和节点内容的值。你需要参考示例并不难。还有一种老方法是XML列表,你可以找到文档化和示例化的Adobe Live Docs xmlList。一旦你对此有足够的了解,你就可以随意设置类文档Variables.a中的变量。无论你在哪里需要它们,你只需在任何你想要的类中调用Variables.enable。