2013-03-16 78 views
0

我正在製作遊戲的排行榜。該排行榜從數組中獲得分數。但是當我添加eventListener時,我只能從數組中獲得一個對象。 這是我的對象數組:for循環中的addEventListener(object [i])給我一個對象不是多個

[{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跟蹤威爾伯特當我點擊文本框,其中威爾伯特是在文本字段被點擊和哈里當哈利的文本框是點擊

但它給了我joost當我點擊威爾伯特,但也當我點擊哈利或joost等。

我如何在toon2deSpeler中獲取正確的對象作爲參數?

回答

0

功能在其中創建它們的範圍(See this page on Function scope)上運行,所以你的在線聽衆:

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

使用itoonHighscoreArray() ,而不是它的「自己的」副本i。儘管如此,儘管您的代碼存在,但您會嘗試訪問highScoreTabel [6],您將獲得空對象引用而不是「joost」。

我真的會推薦擴展TextField並使用屬性highScoreTabel創建對象,然後使用BarışUşaklı的方法。然而,也可以在自己的範圍內創建的每個聽者的功能是這樣的:

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

然後使用,將您即使偵聽器時:

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

這使得很難在以後移除事件監聽器不過,所以你需要分開跟蹤它們。

+0

非常感謝 – 2013-03-16 16:01:15

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]); 
    }); 
} 
+0

給我的文本字段,但我想對象 – 2013-03-16 15:41:52

+1

更新我的答案,請參閱@戴維的答案,你應該真的擴展TextField並創建自己的類,並將你存儲在這些對象中的屬性放入該類。 – 2013-03-16 15:46:45

相關問題