2011-06-08 56 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