Flex4之关于循环注册事件问题
首先呢,标题说的有些模糊,其实我关键的意思就是对于循环里面注册事件的处理方式,其实呢我自己是不会写的
我之前写的就像这样:
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="init()"> <fx:Script> <![CDATA[ import mx.controls.Alert; import mx.controls.Button; function init():void{ for(var i:int=0;i<10;i++){ var btn:Button=new Button(); btn.x=i*20; btn.y=i*20; btn.width=i*40; btn.height=i*20; this.addElement(btn); btn.addEventListener(MouseEvent.CLICK,function(e:MouseEvent){ click(String(i)); } ); } } function click(str:String){ Alert.show(str); } ]]> </fx:Script> <fx:Declarations> <!-- 将非可视元素(例如服务、值对象)放在此处 --> </fx:Declarations> </s:Application>
??初始化时往页面上循环增加十个不同按钮,然后给每个按钮注册一个事件,点击按钮实现操作效果不同,比如上边我就想实现的是点击第一按钮弹出0,点击第二个弹出2....但是实际结果是点击十个按钮显示的都是同一个数字
所以到了问答频道问了问题,一会便有高手回答,他的原话是这样
btn.addEventListener(MouseEvent.CLICK,function(e:MouseEvent){
???????????????? click(String(i));??
?? }
?? );
闭包中获得的i不是当前循环的i,而是当你点击按钮触发事件时,i的值。。
flex很奇怪,在for循环中定义的i,在外部同样可以获得。
正确的写法应该这样:
function init():void{for(var i:int=0;i<10;i++){var btn:Button=new Button();btn.x=i*40;btn.y=i*20;btn.width=40;btn.height=20;this.addChild(btn);btn.addEventListener(MouseEvent.CLICK,clickfunc(i));}}function clickfunc(arg):Function{var func=function(e):void{click(arg)}return func;}function click(str:String){Alert.show(str);}
?
其实我也没搞懂他说的啥意思,反正效果实现了,谁如果清楚原理,请不吝赐教
1 楼 zhong_pro 2011-12-02 其实js也这样闭包的。