2011-06-08 21 views
2

功能我有這樣的代碼:你怎麼一個變量綁定到AS3

for each(var tool in tools){ 
tool.addEventListener(MouseEvent.MOUSE_DOWN, function(){ 
    trace(tool); //Always the last tool 
}); 
} 

怎樣工具的價值結合的功能,因此,它的回調訪問?

回答

6

,你必須使用裏面的函數一個正確綁定範圍的函數。這在AS3中是一種攻擊。如果你可以幫到它,最好不要去那個兔子洞。如果你一定要,但...

for(var tool:Tool in _tools){ 
    var getHandler(scope:Tool):Function{ 
    var t:Tool = scope; 
    return function(e:MouseEvent):void{trace(t)} 
    } 
    tool.addEventListener(MouseEvent.CLICK, getHandler(tool)); 
} 

編輯:當然,你需要在處理工作應傳遞到getHandler以及...所以不是隻接受範圍PARAM任何變量,你也可以傳遞你的ID,數量,當前狀態或其他。

編輯2:但問問自己這個問題。你將如何移除該事件監聽器?這是我說完全避開這個兔子洞的最大原因。這是可能的,但通常比使用更多的OOP解決這個問題的方法比lambda函數更麻煩。

+0

如果getHandler被定義了,會不會是'嵌套'函數,而是出現在我的文檔類中呢? – hoff2 2011-06-08 20:34:38

+0

@Centipedefarmer絕對。事實上,我會說這比我上面寫的更好。 – scriptocalypse 2011-06-08 20:35:46

+1

自從開始這樣做以來,我一直在遇到很多刪除問題。我一直在創建對象的完整副本並重置變量。不是一個好的或乾淨的解決方案,但它的工作原理:/ – QuinnBaetz 2011-06-10 04:16:02

1

試試這個。

for each(var tool in tools){ 
    tool.addEventListener(MouseEvent.MOUSE_DOWN, toolFunction) 
} 

function toolFunction (e:MouseEvent){ 
    trace(e.currentTarget) 
} 

Aftear讀書問題又來冠軍,我意識到,什麼ü需要的是自定義事件或:

for each(var tool in tools){ 
     tool.addEventListener(MouseEvent.CLICK, 
       function(e:MouseEvent){toolFunction (e, "another param")}, 
       false, 0, true); 
    } 

    function toolFunction (e:MouseEvent,anotherParam:String){ 
     trace(e.currentTarget) 
     trace(anotherParam) //output "another param" 
    } 
+0

我需要在未來綁定其他東西,而不僅僅是與mouseEvent相關的東西 – QuinnBaetz 2011-06-08 18:22:16

+0

與e.currentTarget相比,您基本上不會使用MouseEvent本身做很多事情,而是使用目標元素(工具/ s)在你的情況下。這樣,你總會得到正確的工具元素,而不僅僅是最後一個。如果這個工具是一個對象,你可以指定任何你喜歡的東西。 – Urosan 2011-06-08 18:30:39

0

儘量做到:

for each(var tool in tools){ 
var t = tool; 
t.addEventListener(MouseEvent.MOUSE_DOWN, function(){ 
    trace(t); //Always the last tool 
}); 
} 
0

不能在循環內嵌套函數,函數調用的參數在循環的所有迭代中將具有相同的值,並且該值將來自最後一次迭代。有一些竅門可以解決這個問題,但這不是一種好的編程習慣,並且在將來很難修改它。

你需要做的是更多的OOP風格。

由於Tool類顯然是自定義的,因此您需要修改它以保存值或任何您將來討論的引用。
基本上,如果你有一個值需要傳遞給那個對象,那麼就把這個值作爲類Tool的一個屬性。

+0

不,如果你足夠棘手,它肯定有可能早日綁定「工具」的價值。全都歸屬於範圍管理。不過,我同意以OOP的方式做這件事會更好。 – scriptocalypse 2011-06-08 19:39:26

0

使用AS3信號

http://www.peterelst.com/blog/2010/01/22/as3-signals-the-best-thing-since-sliced-bread/

它可以很好地滿足您的問題。一旦我嘗試過信號,我不能回去。它比as3中的事件系統要好得多

+1

你知道,我其實並不是Signals的忠實粉絲。它似乎總是爲另一個問題(繁瑣的聽衆體操)交易(編譯時類型安全性的損失和難以發現的需要訪問原始源代碼的API)。 – scriptocalypse 2011-06-08 20:10:50

相關問題