我有这段代码:
for each(var tool in tools){
tool.addEventListener(MouseEvent.MOUSE_DOWN, function(){
trace(tool); //Always the last tool
});
}
如何将工具的值绑定到函数,以便在回调时可以访问?
答案 0 :(得分: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 ...所以你不仅要接受范围参数,还要传递你的id,count,current state或者其他什么。
EDIT2:但问问自己这个问题。你将如何删除该事件监听器?这是我说完全避免这个兔子洞的最大原因。这是可能的,但通常比使用更多OOP解决这个问题的方法比lambda函数更麻烦。
答案 1 :(得分: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"
}
答案 2 :(得分:0)
尝试做:
for each(var tool in tools){
var t = tool;
t.addEventListener(MouseEvent.MOUSE_DOWN, function(){
trace(t); //Always the last tool
});
}
答案 3 :(得分:0)
您不能在循环中嵌套函数,函数调用的参数将在循环的所有迭代中具有相同的值,并且该值将来自最后一次迭代。有一些黑客可以解决这个问题,但它不是很好的编码实践,并且将来很难修改它。
你需要做的是更多的OOP风格。
由于Tool类显然是自定义的,因此您需要对其进行修改以保存您为将来所讨论的值或任何引用
基本上,如果你有一个值,你需要传递与该对象相关的值,那么只需将该值作为类工具的属性。
答案 4 :(得分:0)
使用as3信号
http://www.peterelst.com/blog/2010/01/22/as3-signals-the-best-thing-since-sliced-bread/
它可以很好地迎合你的问题。一旦我尝试了信号,我就不能回去了。它比as3
中的事件系统好得多