for循环中的addEventListener(object [i])给了我一个不是多个的对象

时间:2013-03-16 14:47:38

标签: arrays actionscript-3 object textfield addeventlistener

我正在为游戏制作排行榜。这个排行榜从阵列获得分数。但是当我添加eventListener时,我只得到数组中的一个对象。 这是我的对象数组:

[{gamenr:1,naam:"wilbert", score:60},{gamenr:1,naam:"joost", score:20},
{gamenr:2,naam:"harry", score:50},{gamenr:2,naam:"john", score:10},
{gamenr:3,naam:"carl", score:30},{gamenr:3,naam:"dj", score:16}]

代码:

public function toonHighscoreArray():Array {
highScoreTabel.sortOn(["score"], [Array.NUMERIC]).reverse();//get highest score on top
var returnArray:Array = new Array();
for ( var i:int = 0; i < 6; i++ ) {
    var scores:TextField = new TextField();
    scores.addEventListener(MouseEvent.CLICK, function(e:MouseEvent){toon2deSpeler(highScoreTabel[i])});

    scores.y = (i * 50) - 50;
    scores.height = 50;
    scores.text = "" + (i + 1) + ".\t" + highScoreTabel[i].naam + " met " + highScoreTabel[i].score + " punten.";
    scores.autoSize = "left";

    returnArray.push(scores);
}
return returnArray;
}

private function toon2deSpeler(score:Object) {
    trace(score.naam);
}

我希望函数toon2deSpeler能够跟踪wilbert,当我点击wilbert在文本字段中的文本字段时点击并且在点击哈利的文本字段时很难看

但是当我点击威尔伯特时,它也让我很高兴,但是当我点击哈利或者约会等时,它也会让我感到很高兴。

如何在toon2deSpeler中将正确的对象作为参数?

2 个答案:

答案 0 :(得分:3)

循环内部的闭包不会像预期的那样工作,一旦调用了事件处理程序,它将使用i的最后一个值。

将for循环更改为:

for ( var i:int = 0; i < 6; i++ ) {
    var scores:TextField = new TextField();
    addScoreListener(scores, i);

    scores.y = (i * 50) - 50;
    scores.height = 50;
    scores.text = "" + (i + 1) + ".\t" + highScoreTabel[i].naam + " met " + highScoreTabel[i].score + " punten.";
    scores.autoSize = "left";

    returnArray.push(scores);
}

private function addScoreListener(score:TextField, index:int):void
{
   scores.addEventListener(MouseEvent.CLICK, function(e:MouseEvent):void{
       toon2deSpeler(highScoreTabel[index]);
   });
}

答案 1 :(得分:0)

函数在创建它们的范围内运行(See this page on Function scope),所以你的内联监听器:

function(e:MouseEvent){toon2deSpeler(highScoreTabel[i])}

正在使用i中的toonHighscoreArray(),而不是i的“自己”副本。鉴于你的代码,你会得到一个空对象引用而不是“joost”,因为你正试图访问highScoreTabel [6]。

我真的建议扩展TextField并使用highScoreTabel的属性创建对象,然后使用BarışUşaklı的方法。但是,可以在自己的范围内创建每个侦听器函数,如下所示:

function getScoreClickListener(scoreID:uint):Function {
    return function(e:MouseEvent){toon2deSpeler(highScoreTabel[scoreID])}
}

然后在添加偶数监听器时使用它:

scores.addEventListener(MouseEvent.CLICK, getScoreClickListener(i));

这使得以后很难删除事件侦听器,因此您需要单独跟踪它们。