Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash AS3从事件侦听器函数返回变量_Flash_Actionscript 3_Flash Cs5 - Fatal编程技术网

Flash AS3从事件侦听器函数返回变量

Flash AS3从事件侦听器函数返回变量,flash,actionscript-3,flash-cs5,Flash,Actionscript 3,Flash Cs5,我试图将XML从事件完成返回到主函数,但不知道如何执行 以下是我调用的函数: 主文件: public var mySendAndLoad:SendAndLoad = new SendAndLoad(); mySendAndLoad.sendData(url,variables) mySendAndLoad类: package { import flash.events.*; import flash.net.*; import flash.xml.XMLDocu

我试图将XML从事件完成返回到主函数,但不知道如何执行

以下是我调用的函数:

主文件:

public var mySendAndLoad:SendAndLoad = new SendAndLoad(); 

mySendAndLoad.sendData(url,variables)
mySendAndLoad类:

package 
{

    import flash.events.*;
    import flash.net.*;
    import flash.xml.XMLDocument;

    public class SendAndLoad
    {
        public var xml:XML = new XML();
        public var xmlList:XMLList;

        public function SendAndLoad()
        {
        }
        public function sendData(url:String, _vars:URLVariables):String
        {
            var request:URLRequest = new URLRequest(url);
            var loader:URLLoader = new URLLoader();
            loader.dataFormat = URLLoaderDataFormat.TEXT;
            request.data = _vars;
            request.method = URLRequestMethod.POST;
            loader.addEventListener(Event.COMPLETE, handleComplete);
            loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
            loader.load(request);
        }
        private function handleComplete(event:Event):String
        {
            var loader:URLLoader = URLLoader(event.target);
            xml = XML(loader.data);
            xmlList = xml.children();
            return(xmlList[1]);
        }
        private function onIOError(event:IOErrorEvent):void
        {
            trace("Error loading URL.");
        }
    }
}
我想要做的是让xmlList返回到主文件。但由于我调用(sendData)的事件中没有它,因此它不会被带回


有什么想法吗?

如果不进行重大修改,您有两种选择:

  • 您的
    SaveAndLoad
    类将驱动EventDispatcher并发送一个包含数据的自定义事件

  • 更干净/不显眼的是进行
    sendData
    方法修改:

    public function sendData(url:String, _vars:URLVariables, resultHandler:Function=null):String
    {
        loader.addEventListener(Event.COMPLETE, resultHandler);
    }
    

  • 您可以传递在主文件中定义的函数,仍然能够在
    SaveAndLoad
    类中为您想要的任何内容附加内部侦听器,并且您将拥有您的数据。

    如果不进行严重修改,您有两个选项:

  • 您的
    SaveAndLoad
    类将驱动EventDispatcher并发送一个包含数据的自定义事件

  • 更干净/不显眼的是进行
    sendData
    方法修改:

    public function sendData(url:String, _vars:URLVariables, resultHandler:Function=null):String
    {
        loader.addEventListener(Event.COMPLETE, resultHandler);
    }
    
  • 您可以传递在主文件中定义的函数,仍然能够在
    SaveAndLoad
    类中为您想要的任何内容附加内部侦听器,并且您将拥有数据。

    只需分派一个事件即可

    package 
    {
    
        import flash.events.Event;
        import flash.display.Sprite;
        import flash.events.*;
        import flash.net.*;
        import flash.xml.XMLDocument;
    
        public class SendAndLoad extend Sprite
        {
            public var xml:XML = new XML();
            public var xmlList:XMLList;
    
            public function SendAndLoad()
            {
            }
            public function sendData(url:String, _vars:URLVariables):String
            {
                var request:URLRequest = new URLRequest(url);
                var loader:URLLoader = new URLLoader();
                loader.dataFormat = URLLoaderDataFormat.TEXT;
                request.data = _vars;
                request.method = URLRequestMethod.POST;
                loader.addEventListener(Event.COMPLETE, handleComplete);
                loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
                loader.load(request);
            }
            private function handleComplete(event:Event):String
            {
                var loader:URLLoader = URLLoader(event.target);
                xml = XML(loader.data);
                xmlList = xml.children();
    
    
               // return(xmlList[1]);
               this.dispatchEvent( new Event( 'ONDATA' ) );
            }
            private function onIOError(event:IOErrorEvent):void
            {
                trace("Error loading URL.");
            }
        }
    }
    
    
    // usage
    var sender:SendAndLoad = new SendAndLoad( );
    sender.addEventListener( 'ONDATA', myXMLLoaded);
    sender.sendData( url, _vars )
    
    function myXMLLoaded( e:Event ):void{
      trace(sender.xml);
    }
    
    只需发送一个事件

    package 
    {
    
        import flash.events.Event;
        import flash.display.Sprite;
        import flash.events.*;
        import flash.net.*;
        import flash.xml.XMLDocument;
    
        public class SendAndLoad extend Sprite
        {
            public var xml:XML = new XML();
            public var xmlList:XMLList;
    
            public function SendAndLoad()
            {
            }
            public function sendData(url:String, _vars:URLVariables):String
            {
                var request:URLRequest = new URLRequest(url);
                var loader:URLLoader = new URLLoader();
                loader.dataFormat = URLLoaderDataFormat.TEXT;
                request.data = _vars;
                request.method = URLRequestMethod.POST;
                loader.addEventListener(Event.COMPLETE, handleComplete);
                loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
                loader.load(request);
            }
            private function handleComplete(event:Event):String
            {
                var loader:URLLoader = URLLoader(event.target);
                xml = XML(loader.data);
                xmlList = xml.children();
    
    
               // return(xmlList[1]);
               this.dispatchEvent( new Event( 'ONDATA' ) );
            }
            private function onIOError(event:IOErrorEvent):void
            {
                trace("Error loading URL.");
            }
        }
    }
    
    
    // usage
    var sender:SendAndLoad = new SendAndLoad( );
    sender.addEventListener( 'ONDATA', myXMLLoaded);
    sender.sendData( url, _vars )
    
    function myXMLLoaded( e:Event ):void{
      trace(sender.xml);
    }
    
    }

    在主文件中

    public var mySendAndLoad:SendAndLoad = new SendAndLoad(); 
    mySendAndLoad.addEventListener(Event.COMPLETE, xmlLoadCompleted);
    mySendAndLoad.sendData(url,variables)
    
    private function xmlLoadCompleted(e:Event):void {
        var childToUse:XML=mySendAndLoad.xmlList[1];
        //whatever else you want to do 
    }
    
    }

    在主文件中

    public var mySendAndLoad:SendAndLoad = new SendAndLoad(); 
    mySendAndLoad.addEventListener(Event.COMPLETE, xmlLoadCompleted);
    mySendAndLoad.sendData(url,variables)
    
    private function xmlLoadCompleted(e:Event):void {
        var childToUse:XML=mySendAndLoad.xmlList[1];
        //whatever else you want to do 
    }
    

    您必须使用
    dispatchEvent

    首先向它申报

    public class personal_info extends EventDispatcher { }
    
    您必须将listener定义到该类中

       dispatchEvent(new Event(Event.COMPLETE));
    

    您必须使用
    dispatchEvent

    首先向它申报

    public class personal_info extends EventDispatcher { }
    
    您必须将listener定义到该类中

       dispatchEvent(new Event(Event.COMPLETE));
    

    我明白你的意思,但是我应该在主文件中放什么呢?在主文件中定义一个函数:private function handleLoadComplete(event:event):void{},当调用mySendAndLoad.sendData(url,variables)时,只需调用mySendAndLoad.sendData(url,variables,handleLoadComplete)。您将侦听器附加到加载程序,其处理程序是对主文件中定义的函数的引用。我明白您的意思,但我将在主文件中放置什么?在主文件中,您定义了一个函数:private function handleLoadComplete(event:event):void{}和调用mySendAndLoad.sendData(url,变量)您只需调用mySendAndLoad.sendData(url、变量、handleLoadComplete)。您将一个侦听器附加到加载程序,其处理程序引用主文件中定义的函数。相反,您可以使用此.dispatchEvent(事件);现在在创建对象var sender的主类中:SendAndLoad=newsendandload();您将添加一个事件侦听器。sender.addEventListener(Event.COMPLETE,myXMLLoaded);在函数myxmloaded中,您现在可以访问分配给sender.xml的var上的数据。这有帮助吗?如果您仍然不明白,我需要您编辑您的问题,并在创建SendAndLoad对象的地方发布代码。即使我们不知道类SaveAndLoad不是派生的EventDispatcher(也称为无法调度事件),此技术不起作用,因为在重新分派事件后,事件的
    目标将不是加载器,而是SaveAndLoad intance。我得到了一个“undefined method dispatchEvent through static type SendAndLoad”错误。正如我发布的代码所示,return语句被注释掉了。相反,您可以使用此.dispatchEvent(事件);现在在创建对象var sender的主类中:SendAndLoad=newsendandload();您将添加一个事件侦听器。sender.addEventListener(Event.COMPLETE,myXMLLoaded);在函数myxmloaded中,您现在可以访问分配给sender.xml的var上的数据。这有帮助吗?如果您仍然不明白,我需要您编辑您的问题,并在创建SendAndLoad对象的地方发布代码。即使我们不知道类SaveAndLoad不是派生的EventDispatcher(也称为无法调度事件),此技术不起作用,因为在重新分派事件后,事件的
    目标将不是加载程序,而是SaveAndLoad intance。我得到了一个“undefined method dispatchEvent through static type SendAndLoad”错误。您好,我刚刚尝试在我自己的项目中使用此代码。但是,Flash报告了公共函数sendData的一个错误,表示它没有返回值。我尝试将函数设置为:void,但它仍然显示相同的错误。有什么帮助吗?Thanks@MrPablo哇,真不敢相信这么长时间没人发现那个错误。我已经编辑了答案(将函数更改为void),它工作正常。我建议你清理这个项目(如果你使用的是Flash Builder),或者重新启动Flash Pro,然后重试。是的,我在发表我的评论后不久就明白了!嗨,我刚刚尝试在我自己的项目中使用这段代码。但是,Flash报告了公共函数sendData的一个错误,表示它没有返回值。我尝试将函数设置为:void,但它仍然显示相同的错误。有什么帮助吗?Thanks@MrPablo哇,真不敢相信这么长时间没人发现那个错误。我已经编辑了答案(将函数更改为void),它工作正常。我建议你清理这个项目(如果你使用的是Flash Builder),或者重新启动Flash Pro,然后重试。是的,我在发表我的评论后不久就明白了!