功能我有這樣的代碼:你怎麼一個變量綁定到AS3
for each(var tool in tools){
tool.addEventListener(MouseEvent.MOUSE_DOWN, function(){
trace(tool); //Always the last tool
});
}
怎樣工具的價值結合的功能,因此,它的回調訪問?
功能我有這樣的代碼:你怎麼一個變量綁定到AS3
for each(var tool in tools){
tool.addEventListener(MouseEvent.MOUSE_DOWN, function(){
trace(tool); //Always the last tool
});
}
怎樣工具的價值結合的功能,因此,它的回調訪問?
,你必須使用裏面的函數一個正確綁定範圍的函數。這在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函數更麻煩。
試試這個。
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"
}
我需要在未來綁定其他東西,而不僅僅是與mouseEvent相關的東西 – QuinnBaetz 2011-06-08 18:22:16
與e.currentTarget相比,您基本上不會使用MouseEvent本身做很多事情,而是使用目標元素(工具/ s)在你的情況下。這樣,你總會得到正確的工具元素,而不僅僅是最後一個。如果這個工具是一個對象,你可以指定任何你喜歡的東西。 – Urosan 2011-06-08 18:30:39
儘量做到:
for each(var tool in tools){
var t = tool;
t.addEventListener(MouseEvent.MOUSE_DOWN, function(){
trace(t); //Always the last tool
});
}
不能在循環內嵌套函數,函數調用的參數在循環的所有迭代中將具有相同的值,並且該值將來自最後一次迭代。有一些竅門可以解決這個問題,但這不是一種好的編程習慣,並且在將來很難修改它。
你需要做的是更多的OOP風格。
由於Tool類顯然是自定義的,因此您需要修改它以保存值或任何您將來討論的引用。
基本上,如果你有一個值需要傳遞給那個對象,那麼就把這個值作爲類Tool的一個屬性。
不,如果你足夠棘手,它肯定有可能早日綁定「工具」的價值。全都歸屬於範圍管理。不過,我同意以OOP的方式做這件事會更好。 – scriptocalypse 2011-06-08 19:39:26
使用AS3信號
http://www.peterelst.com/blog/2010/01/22/as3-signals-the-best-thing-since-sliced-bread/
它可以很好地滿足您的問題。一旦我嘗試過信號,我不能回去。它比as3中的事件系統要好得多
你知道,我其實並不是Signals的忠實粉絲。它似乎總是爲另一個問題(繁瑣的聽衆體操)交易(編譯時類型安全性的損失和難以發現的需要訪問原始源代碼的API)。 – scriptocalypse 2011-06-08 20:10:50
如果getHandler被定義了,會不會是'嵌套'函數,而是出現在我的文檔類中呢? – hoff2 2011-06-08 20:34:38
@Centipedefarmer絕對。事實上,我會說這比我上面寫的更好。 – scriptocalypse 2011-06-08 20:35:46
自從開始這樣做以來,我一直在遇到很多刪除問題。我一直在創建對象的完整副本並重置變量。不是一個好的或乾淨的解決方案,但它的工作原理:/ – QuinnBaetz 2011-06-10 04:16:02