Actionscript 3 在电影剪辑AS3中找不到我的二维数组

Actionscript 3 在电影剪辑AS3中找不到我的二维数组,actionscript-3,flash,multidimensional-array,Actionscript 3,Flash,Multidimensional Array,我是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

我是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"])}

这很有魅力。但是当我想在下一帧中跟踪它时,它会给我一个错误。几年前,我曾经做过0级变量,所以我可以用trace\u level0.countdowns[ambar][image]来跟踪它们,但是traceMovieCliproot.countdowns[ambar][image]似乎做不到同样的事情。我的二维数组在哪里?如何从其他movieclips访问它?

最可能的问题是,在加载xml之前到达下一帧

由于xmlLoader.load是异步的,所以即使程序还没有加载,它也会移动到下一帧,而在1帧的范围内,它永远不会加载那么快


要纠正这一点,只需在第一帧或该代码所在的任何帧上停止,然后在onXmlLoad函数中播放或下一帧。

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

由于xmlLoader.load是异步的,所以即使程序还没有加载,它也会移动到下一帧,而在1帧的范围内,它永远不会加载那么快


要纠正这一点,只需在第一帧或代码所在的任何帧上停止,然后在onXmlLoad函数中播放或下一帧。

让我们直接开始。这里有许多问题:

1实例化数组时缺少括号。应该是:

var countdowns:Array = new Array();
或者更简洁、更快速的文字:

var countdowns:Array = [];
2在调用load之后,您正在添加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();
如果要使用字符串,则应使用如下对象或字典:

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

5查看“for each”,它将为您提供一个更紧凑的循环。

让我们直接开始吧。这里有许多问题:

1实例化数组时缺少括号。应该是:

var countdowns:Array = new Array();
或者更简洁、更快速的文字:

var countdowns:Array = [];
2在调用load之后,您正在添加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();
如果要使用字符串,则应使用如下对象或字典:

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

5检查“for each”,这将为您提供一个更紧凑的循环。

对于1,在AS3/JS中实例化实际上不需要括号,尽管我认为括号可以使代码更可读。对于4,数组实际上可以使用基于EcmaScript的语言(如AS3/JS)中的字符串进行索引。AS3并不总是有一个本机字典类型,所以在人们在网上找到的AS3代码示例中看到字符串索引数组是很常见的。谢谢@Gareth!BadfeelingAbout此解决方案使脚本正常工作,但所有这些信息对我正确编码非常有帮助。@BadfeelingAbout此,如果您使用字符串索引为数组赋值,然后使用Flex SDK编译,您将正确地看到数组为空,因为赋值无效。@BadfeelingAbout此,关于省略括号,是的,它在这种情况下仍然有效,因为ECMAscript规范允许在不需要构造函数参数的情况下省略它。但对于一个明显的学习者来说,这是一个不必要的干扰。对于1,括号实际上在AS3/JS中不需要用于实例化,尽管我想说它们使代码更可读。对于4,数组实际上可以用基于EcmaScript的语言(如AS3/JS)中的字符串进行索引。AS3并不总是有一个本机字典类型,所以在人们在网上找到的AS3代码示例中看到字符串索引数组是很常见的。谢谢@Gareth!Badfeelingabout此解决方案使脚本正常工作,但所有这些信息对于正确编码非常有帮助。@Badfeelingabout如果您使用字符串索引为数组赋值,然后使用
使用Flex SDK,您会正确地看到数组是空的,因为赋值无效。@BadfeelingAbout关于省略括号,是的,在这种情况下它仍然有效,因为ECMAscript规范允许在不需要构造函数参数的情况下省略它。但是对于一个明显的学习者来说,这是一个不必要的干扰。谢谢你的坏感觉。这件小事让一切都顺利。我就知道我忘了这么简单的事情!谢谢你的恶意这件小事让一切顺利。我就知道我忘了这么简单的事情!