我刚刚开始探索包的使用。我希望函数的结果(作为变量“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();
?
非常感谢。
答案 0 :(得分:2)
创建一个名为“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 googles将为您提供大量示例。注意设置,加载,加载完成,获取数据是您想要的流程。因此,只有在调用onComplete函数后才能继续执行应用程序。
加载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);
}