我是AS3的新手,我在读取xml后创建的二维数组时遇到了麻烦。这是代码:
var countdowns:Array = new Array;
var xmlLoader:URLLoader = new URLLoader();
var url:URLRequest = new URLRequest("products.xml");
xmlLoader.load(url);
xmlLoader.addEventListener(Event.COMPLETE, onXmlLoad);
function onXmlLoad(e:Event):void
{
var xml = new XML(xmlLoader.data);
var productElements:XMLList = xml.product;
var len:int = productElements.length();
for (var i:int = 0; i < len; i++)
{
var productElement:XML = productElements[i];
countdowns[productElements[i].name] = new Array;
countdowns[productElements[i].name]["name"] = productElements[i].name;
countdowns[productElements[i].name]["user"] = productElements[i].user;
countdowns[productElements[i].name]["image"] = productElements[i].image;
countdowns[productElements[i].name]["fondo"] = productElements[i].fondo;
}
trace("Productos: "+countdowns["ambar"]["image"])}
这就像一个魅力。但是当我想在下一帧中跟踪它时,它会给我一个错误。多年前我曾经_level0 vars
这样做,所以我可以用trace(_level0.countdowns["ambar"]["image"])
跟踪它们,但似乎trace(MovieClip(root).countdowns["ambar"]["image"])
没有做同样的事情。我的二维数组在哪里?如何从其他动画片段访问它?
答案 0 :(得分:2)
最有可能的问题是,在xml完成加载之前已到达下一帧。
由于xmlLoader.load
是异步的,你的程序将继续移动到下一帧,即使它还没有加载(在1帧的范围内,它永远不会加载那么快)。
要解决此问题,只需在第一帧(或此代码所在的任何帧)上放置stop
,然后在play()
内nextFrame()
(或onXmlLoad
)功能
答案 1 :(得分:2)
让我们直接进入它。这里有很多问题:
1)实例化Array时缺少括号。它应该是:
var countdowns:Array = new Array();
或者更简洁,更快的文字:
var countdowns:Array = [];
2)您在调用load()之后添加了加载侦听器。但是,因为你的完成&#39;之后只会添加侦听器,如果负载立即完成,则可能永远不会触发侦听器。在调用可能触发事件的方法之前,应始终添加侦听器:
xmlLoader.addEventListener(Event.COMPLETE, onXmlLoad);
xmlLoader.load(url);
3)无需为您未使用的变量分配内存。你不需要url变量,因为这样做会很好:
xmlLoader.load(new URLRequest("products.xml"));
4)您使用字符串(即&#34; ambar&#34;)作为产品元素的名称,但使用它们作为倒计时数组的索引:
countdowns[productElements[i].name] = new Array();
数组没有用字符串编制索引 - 它们用以下数字编入索引:
countdowns[i] = new Array();
如果你想使用字符串,那么你应该使用这样的对象或字典:
var countdowns:Dictionary = new Dictionary();
countdowns[productElements[i].name] = new Array();
5)查看每个&#39;这会给你一个更紧凑的循环。