Flash Actionscript 3-如何在删除某个事件后保留该事件的值

Flash Actionscript 3-如何在删除某个事件后保留该事件的值,flash,actionscript-3,flash-builder,flash-cs5,flash-cs4,Flash,Actionscript 3,Flash Builder,Flash Cs5,Flash Cs4,在我的事件处理程序函数期间(函数在event.COMPLETE之后执行),我为我的xml对象设置了一个值(xml=newXML(e.currentTarget.data);),如果我在事件函数处理程序中跟踪对象,它将显示我的xml数据 但是如果我试图在事件处理函数之外跟踪它,它不会显示我的xml内容。难道没有办法让我的xml对象内容值显示在其他函数中,而不是在事件处理程序函数中吗 private var xml:XML; public function XMLLoader(xmlURL:St

在我的事件处理程序函数期间(函数在event.COMPLETE之后执行),我为我的xml对象设置了一个值(xml=newXML(e.currentTarget.data);),如果我在事件函数处理程序中跟踪对象,它将显示我的xml数据

但是如果我试图在事件处理函数之外跟踪它,它不会显示我的xml内容。难道没有办法让我的xml对象内容值显示在其他函数中,而不是在事件处理程序函数中吗

private var xml:XML; 

public function XMLLoader(xmlURL:String) 
{ 
    var xmlURLRequest:URLRequest = new URLRequest(xmlURL); 
    var xmlURLLoader:URLLoader  = new URLLoader(xmlURLRequest); 
    xmlURLLoader.addEventListener(Event.COMPLETE, xmlData); 
}

private function xmlData(e:Event):void 
{
    e.currentTarget.removeEventListener(Event.COMPLETE, xmlData); 
    xml = new XML(e.currentTarget.data); 
    dispatchEvent(new Event(Event.COMPLETE)); 
    trace(xml); 
} 

public function getXMLData():void 
{ 
     //I've find out that this shows null because this function is faster
     //what do i do? put an event.complete in every following function?
    trace(xml);
}

谢谢。

我想您在
xmloader()
之后立即调用
getXMLData()
,此时
xml
对象仍然为空。尝试调用
getXMLData()
内部的
xmlData()
函数,您应该会看到区别。

我认为您在
xmloader()
之后立即调用
getXMLData()
,此时
xml
对象仍然为空。尝试调用
getXMLData()
函数内部的
xmlData()
函数,您应该会看到其中的区别。

您可能在URLLoader完成之前调用了getXMLData(),但是,一般来说,您正在执行的代码是错误的。Actionscript没有任何阻塞,因此当您使用URLRequest实例化新的URLLoader时,它会立即开始加载操作。例如,如果文件已缓存,则在开始加载操作后附加它时,Event.COMPLETE侦听器可能永远不会启动

下面是创建和加载数据的理想过程:

var data:XML;
var urlLoader:URLLoader = new URLLoader();

urlLoader.addEventListener(Event.COMPLETE, urlLoader_completeHandler);
urlLoader.load(new URLRequest("path"));

private function urlLoader_completeHandler(event:Event):void
{
    data = new XML(urlLoader.data);
}
如果您想将其应用于您自己的XMLLoader类,我已经在AS3中包含了“适当的”实现……但是非常详细

import flash.net.URLLoader;
import flash.events.Event;

class XMLLoader extends URLLoader
{
    public function XMLLoader()
    {
        super();
        addEventListener(Event.COMPLETE, completeHandler);
    }

    private function completeHandler(event:Event):void
    {
        dispatchEvent(new XMLLoaderEvent(XMLLoaderEvent.COMPLETE, new XML(data)));
    }
}

class XMLLoaderEvent extends Event
{
    public static const COMPLETE:String = "xmlLoaderComplete";

    public var data:XML;

    public function XMLLoaderEvent(type:String, data:XML = null, bubbles:Boolean = false, cancelable:Boolean = false)
    {
        super(type, bubbles, cancelable);

        this.data = data;
    }

    override public function clone():Event
    {
        return new XMLLoaderEvent(type, data, bubbles, cancelable);
    }
}
要使用XMLLoader类,请执行以下操作:

var xmlLoader:XMLLoader = new XMLLoader();
xmlLoader.addEventListener(XMLLoaderEvent.COMPLETE, function(event:XMLLoaderEvent):void
{
    trace(event.data);
});

xmlLoader.load(new URLRequest("data.xml"));

祝你好运

您可能在URLLoader完成之前调用了getXMLData(),但是,通常情况下,您正在执行的代码是错误的。Actionscript没有任何阻塞,因此当您使用URLRequest实例化新的URLLoader时,它会立即开始加载操作。例如,如果文件已缓存,则在开始加载操作后附加它时,Event.COMPLETE侦听器可能永远不会启动

下面是创建和加载数据的理想过程:

var data:XML;
var urlLoader:URLLoader = new URLLoader();

urlLoader.addEventListener(Event.COMPLETE, urlLoader_completeHandler);
urlLoader.load(new URLRequest("path"));

private function urlLoader_completeHandler(event:Event):void
{
    data = new XML(urlLoader.data);
}
如果您想将其应用于您自己的XMLLoader类,我已经在AS3中包含了“适当的”实现……但是非常详细

import flash.net.URLLoader;
import flash.events.Event;

class XMLLoader extends URLLoader
{
    public function XMLLoader()
    {
        super();
        addEventListener(Event.COMPLETE, completeHandler);
    }

    private function completeHandler(event:Event):void
    {
        dispatchEvent(new XMLLoaderEvent(XMLLoaderEvent.COMPLETE, new XML(data)));
    }
}

class XMLLoaderEvent extends Event
{
    public static const COMPLETE:String = "xmlLoaderComplete";

    public var data:XML;

    public function XMLLoaderEvent(type:String, data:XML = null, bubbles:Boolean = false, cancelable:Boolean = false)
    {
        super(type, bubbles, cancelable);

        this.data = data;
    }

    override public function clone():Event
    {
        return new XMLLoaderEvent(type, data, bubbles, cancelable);
    }
}
要使用XMLLoader类,请执行以下操作:

var xmlLoader:XMLLoader = new XMLLoader();
xmlLoader.addEventListener(XMLLoaderEvent.COMPLETE, function(event:XMLLoaderEvent):void
{
    trace(event.data);
});

xmlLoader.load(new URLRequest("data.xml"));

祝你好运

更改跟踪方法以指示xml是否已加载…
你正在进入比赛状态

private var _xmlLoaded:Boolean=false;// add this to see if the xml is loaded
private function xmlData(e:Event):void 
{
    e.currentTarget.removeEventListener(Event.COMPLETE, xmlData); 
    xml = new XML(e.currentTarget.data); 
    _xmlLoaded=true;
    dispatchEvent(new Event(Event.COMPLETE)); 
    trace(xml); 
} 
public function getXMLData():void 
{ 
    if (_xmlLoaded)
        trace(xml);
    else
        trace("not yet loaded");
}

更改跟踪方法以指示xml是否已加载…
你正在进入比赛状态

private var _xmlLoaded:Boolean=false;// add this to see if the xml is loaded
private function xmlData(e:Event):void 
{
    e.currentTarget.removeEventListener(Event.COMPLETE, xmlData); 
    xml = new XML(e.currentTarget.data); 
    _xmlLoaded=true;
    dispatchEvent(new Event(Event.COMPLETE)); 
    trace(xml); 
} 
public function getXMLData():void 
{ 
    if (_xmlLoaded)
        trace(xml);
    else
        trace("not yet loaded");
}

//注意:如果要直接访问此“类”的函数而不使用该类上的任何事件侦听器,请使用此选项,因为它在每个函数上都有其事件侦听器(这导致只有一个函数getXMLData())

私有var-xml:xml

公共函数XMLLoader(xmlURL:String) {

}

私有函数xmlData(e:事件):void {

}

公共函数getXMLData():void {


//注意:如果要直接访问此“类”的函数而不使用该类上的任何事件侦听器,请使用此选项,因为它在每个函数上都有其事件侦听器(这导致只有一个函数getXMLData())

私有var-xml:xml

公共函数XMLLoader(xmlURL:String) {

}

私有函数xmlData(e:事件):void {

}

公共函数getXMLData():void {


私有var xml:xml;公共函数XMLLoader(xmlURL:String){var xmlURLRequest:URLRequest=new URLRequest(XmlUrlURL);var xmlURLLoader:URLLoader=new URLLoader(xmlURLRequest);xmlURLLoader.addEventListener(Event.COMPLETE,xmlData);}私有函数xmlData(e:Event):void{.currentTarget.removeEventListener(Event.COMPLETE,xmlData);xml=new-xml(e.currentTarget.data);dispatchEvent(new-Event(Event.COMPLETE));trace(xml);}公共函数getXMLData():void{trace(xml);}您可以在安装
xmloader
的地方发布代码并调用
getXMLData()
method?公共类XMLLoader扩展了EventDispatcher{private var xml:xml;公共函数XMLLoader(xmlURL:String){var xmlURLRequest:URLRequest=new URLRequest(xmlURLRequest);var xmlURLLoader:URLLoader=new URLLoader(xmlURLRequest);xmlURLLoader.addEventListener(Event.COMPLETE,xmlData);}私有函数xmlData(e:Event):void{e.currentTarget.removeEventListener(Event.COMPLETE,xmlData);xml=new-xml(e.currentTarget.data);dispatchEvent(new-Event(Event.COMPLETE));trace(xml);//这个显示}公共函数getXMLData():xml{trace(xml);//这个不显示}您可以在您的问题中发布代码吗?这样更容易阅读。但我希望看到的是您将
getXMLData()
new-XMLLoader(“xmlURL”)
。私有变量xml:xml;公共函数XMLLoader(xmlURL:String){var-xmlURLRequest:URLRequest=new-URLRequest(xmlURL);var xmlURLLoader:URLLoader=new URLLoader(xmlURLRequest);xmlURLLoader.addEventListener(Event.COMPLETE,xmlData);}私有函数xmlData(e:Event):void{e.currentTarget.removeEventListener(Event.COMPLETE,xmlData);xml=new xml(e.currentTarget.data);dispatchEvent(new Event(Event.COMPLETE));跟踪(xml)}公共函数getXMLData():void{trace(xml);}您可以在安装
XMLLoader
的地方发布代码,并调用
getXMLData()
方法吗?公共类XMLLoader扩展EventDispatcher{private var xml:xml;公共函数XMLLoader(xmlURL:String){var XMLURLRRequest:URLRequest=new URLRequest(xmlURL);var xmlURLLoader:URLLoader=新的URLLoader(xmlURLRequest);xmlURLLoader.addEventListener(Event.COM