0

我有解析 xml 并在 XML 中为每个项目创建按钮的 AS3 类。但是我想稍后访问项目总数。我该怎么做?

我正在这样使用它。

var menu:MenuClass = new MenuClass();
trace( menu.aItems() );

现在它正在重新调整,NAN但是如果我在一行之后跟踪它,Items = xml.item.length();它会输出正确的数字。

package com.lib.menu
{
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.net.URLLoader;
    import flash.net.URLRequest;

    public class MenuClass extends MovieClip {

        private var urlLoader:URLLoader;
        private var urlRequest:URLRequest;
        private const XML_PATH:String = "resources/menu.xml";
        private var xml:XML;
        protected var Items:Number;

        public function MenuClass() {

            urlLoader = new URLLoader();
            urlLoader.load(new URLRequest(XML_PATH));
            urlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
        }
        private function xmlLoaded(e:Event):void 
        {
            xml = new XML(e.target.data);
            Items =  xml.item.length();
            for (var i:int = 0; i < Items; i++) {
                var btn:Button = new Button(xml.item[i].@title,xml.item[i].@image);
                btn.y = Math.floor(i * (btn.height+2)) ;
                addChild(btn);
            }
        }
        public function aItems():Number {
            return Items;
        }

    }

}
4

2 回答 2

3

URLLoader异步加载数据,这意味着构造函数MenuClass不会等待加载完成。当 XML 加载完成xmlLoaded时,将调用一个有效值并将其设置为Items. 但是您试图Items在创建对象之后访问,即xmlLoaded调用之前。所以你正在NaN那个时候。

于 2013-11-12T16:27:16.383 回答
0

好的。我通过添加this.dispatchEvent(new Event("MenuComplete"));到末尾private function xmlLoaded(e:Event):void 然后解决了这个问题

var menu:MenuClass = new MenuClass();
menu.addEventListener('MenuComplete', onNext); 
function onNext(e:Event):void{
    trace(menu.aItems());
}
于 2013-11-12T16:44:04.883 回答