【问题标题】:AS3 Scope IssueAS3 范围问题
【发布时间】:2011-05-04 02:16:35
【问题描述】:

我在使用 Flash 创建的类中遇到了范围问题。我正在创建一个应用程序,该应用程序利用 XML 来创建我将操作并重新保存到 XML 的信息数组。

我有一个文档类正在调用另一个类,该类用于加载 XML,将其转换为数组并使用方法将数组返回给文档构造函数。我已成功解析 XML 并创建了一个数据数组,但似乎无法通过 loadXMLData 类中的 processXML 函数将数据添加到数组中。

我从代码中删除了所有无关紧要的内容。这是我正在尝试做的基本表示。

我的文档类

package  {

    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.utils.*;


    public class dashBoard extends MovieClip {

        public var newData

        //initialize the dashBoard
        public function dashBoard(){

            //construct the Dashboard Object
            trace("Dashboard Initialized");
            trace("|--------------XML Data--------------|");
            newData = new loadXMLData();
            trace(newData.getSections());


        }

    }

}

我的 loadXMLData 类

 package  {

        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.net.URLLoader;
        import flash.net.URLRequest;
        import flash.utils.*;

        public class loadXMLData extends MovieClip {

                //initialize an array that will be used in the document class
                public var sectionList:Array = new Array();

                public function loadXMLData() { 

                    //load the xml file containing the data
                    var myLoader = new URLLoader();
                    myLoader.load(new URLRequest("dashboard.xml"));
                    myLoader.addEventListener(Event.COMPLETE, processXML); 

                function processXML(e:Event):void {

                     //process the xml file after it loads
                             //and create an object
                     var newXML:XML = new XML(e.target.data);

                             //then I use the XML to populate my 
                             //array i declared at the top
                             //this is a simple test
                             sectionList[0] = "test";

                }

            }

                //and this is the method i use in the document class
                //to get the sectionList array
            public function getSections():Array{
                 return sectionList;
                }

        }

    }

看起来很简单,但我似乎无法编辑数组。文档类总是返回一个空白数组。有什么想法吗?

【问题讨论】:

    标签: xml arrays actionscript-3 oop


    【解决方案1】:

    您正在尝试访问尚不存在的信息。当 XML 完成加载后,在您的 loadXMLData.processXML() 函数中调度一个事件,如下所示:

    function processXML(e:Event):void
    {
    
        //process the xml file after it loads
        //and create an object
        var newXML:XML = new XML(e.target.data);
    
        dispatchEvent(new Event("xml_loaded"));
    
    }
    

    然后在你做这样的事情之前听它:

    package
    {
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.net.URLLoader;
        import flash.net.URLRequest;
        import flash.utils.*;
    
    
        public class dashBoard extends MovieClip
        {
    
            public var newData:loadXMLData;
    
            //initialize the dashBoard
            public function dashBoard(){
    
                //construct the Dashboard Object
                trace("Dashboard Initialized");
                newData = new loadXMLData();
    
                newData.addEventListener("xml_loaded", _xmlLoaded);
            }
    
            private function _xmlLoaded(e:Event):void
            {
                trace("|--------------XML Data--------------|");
                trace(newData.getSections());
                newData.removeEventListener("xml_loaded", _xmlLoaded);
            }
        }
    }
    

    【讨论】:

    • 你是最棒的!感谢你的帮助。我是面向对象编程的新手,我才刚刚开始了解它的强大功能。
    【解决方案2】:

    这条线很有可能是: trace(newData.getSections()); 在填充数组的函数 processXML 之前发生。这是因为 processXML 正在响应 Event.COMPLETE,这可能需要几秒钟才能完成。

    在尝试输出之前,您的文档还应该“侦听”事件(您的加载器类应该分派)。

    【讨论】:

      【解决方案3】:

      这不是范围问题,您正在构建 loadXMLData,然后立即尝试获取 sectionList,而无需等待它加载。构造函数调用和getSections调用是同步的,但实际的XML文件加载是异步的。

      理想情况下,您的 loadXMLData 对象将从 processXML 处理程序函数中分派一个 COMPLETE 事件,您的文档类会监听该事件(就像您的 loadXMLData 监听 Loader 完成一样)

      【讨论】:

        猜你喜欢
        • 2014-12-28
        • 1970-01-01
        • 2020-03-04
        • 2010-11-09
        • 2011-01-08
        • 2011-04-09
        • 2017-01-05
        • 2016-08-04
        • 2014-04-09
        相关资源
        最近更新 更多