如何将变量绑定到as3中的函数

时间:2011-06-08 17:57:38

标签: flash actionscript-3 function binding

我有这段代码:

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

如何将工具的值绑定到函数,以便在回调时可以访问?

5 个答案:

答案 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

中的事件系统好得多