在影片剪辑 AS3 上找不到我的二维数组

Can't find my bidimensional array on a movie clip AS3

我是 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"]) 不这样做。我的二维数组在哪里?我怎样才能从其他影片剪辑访问它?

很可能,您的问题是在 xml 完成加载之前到达下一帧。

由于 xmlLoader.load 是异步的,您的程序将移动到下一帧,即使它尚未加载(在 1 帧的跨度内,它永远不会加载那么快)。

要纠正这个问题,只需在第一帧(或此代码所在的任何帧)上放置一个 stop,然后在 [=14] 内放置 play()(或 nextFrame()) =]函数。

让我们进入正题。这里有很多问题:

1) 实例化 Array 时缺少括号。应该是:

var countdowns:Array = new Array();

或者更简洁、速度稍快的文字:

var countdowns:Array = [];

2) 您在调用 load() 之后添加负载侦听器。但是由于您的 'on complete' 侦听器仅在之后添加,如果加载立即完成,那么您的侦听器可能永远不会被触发。您应该始终在调用可能触发事件的方法之前添加侦听器:

xmlLoader.addEventListener(Event.COMPLETE, onXmlLoad);
xmlLoader.load(url);

3) 无需为不使用的变量分配内存。您不需要 url 变量,因为这样就可以了:

xmlLoader.load(new URLRequest("products.xml"));

4) 您正在使用字符串(即 "ambar")作为产品元素的名称,但将它们用作倒计时数组的索引:

countdowns[productElements[i].name] = new Array();

数组不是用字符串索引的——它们是用这样的数字索引的:

countdowns[i] = new Array();

如果你想使用字符串,那么你应该使用这样的对象或字典:

var countdowns:Dictionary = new Dictionary();
countdowns[productElements[i].name] = new Array();

5) 查看 'for each' 这会给你一个更紧凑的循环。