我有AS3类,它解析xml并在XML中创建foreach项的按钮。但是我想稍后访问项目总数。我怎么能这样做?
我这样使用它。
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;
}
}
}
答案 0 :(得分:3)
URLLoader
异步加载数据,这意味着构造函数MenuClass
不会等待加载完成。加载XML完成后,将调用xmlLoaded
,并将有效值设置为Items
。但是,您在创建对象后,即在调用Items
之前尝试访问xmlLoaded
。所以你在那时得到NaN
。
答案 1 :(得分: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());
}