flex注册监听器带额外参数的解决

来源:互联网 发布:淘宝现货是什么意思 编辑:程序博客网 时间:2024/06/05 17:03

flex的事件功能很强大,自定义的事件可以传输任何我想要的数据作为参数,但是对于系统事件,我想要传一些额外的参数时应该怎么办呢?网上查到的方法一般是采用闭包特性,即采用如下方法:

 

this.addEventListener(LoadDataEvent.LOADDATA_EVENT,function(event:Event):void{      abc(arg1, arg2);  });


当然对于用户自定义事件想要传递事件包含信息之外的参数,也是可以使用这种方法的。这种方法大部分情况下都是可以使用的,但是我在实验中却遇到了属于少部分的例外情况。

实验场景如下:有一个FileReference的ArrayCollection,对这个ArrayCollection中的每一个FileReference进行load操作,在每一个FileReference加载完成后进行一些操作,例如输出当前FileReference在ArrayCollection中的下标。原始代码如下:

privae function loadf():void{var index:int = 0;for(var i:int=0; i<arr.length;i++){index = i;file:FileReference = arr.getItemAt(i) as FileReference;file.addEventListener(Event.COMPLETE, function(e:Event):void{onCompleted(e,index)});file.load();}}private function onCompleted(e:Event,i:int):void{Alert.show(“第”+(i+1)+”个文件加载完成”);}


假设有3个比较大的文件,那么运行上面的代码,得到的结果就是3个Alert提示输出的均为“第3个文件加载完成”。究其原因,我们推测,flex在使用index时并不是使用的值,而是指出了index值存储的位置,当实际使用它的值的时候再到该位置去取(不确定flex是否如此操作的,只是这么解释看似比较合理),那么当前两个文件都加载完成之后,index的值早已经是2了,所以Alert输出的内容只能是3。

当然上面例子里这个index是完全没有必要的,我只是为了说明问题将它放到这里的。

目前我想到的解决上述问题的方法,是创建一个新的类,其参数为一个FileReference和一个index,对FileReference的COMPLETE事件捕获后添加index参数再发出一个新的事件。例如新类为NewFileStruct,参数为:

private var _f:FileReference;private var _fileIndex:int;


在构造函数中注册FileReference的Event.COMPLETE事件的监听函数,监听函数内容如下:

private function onComplete(e:Event):void{var mycom:myComplete = new myComplete(myComplete.ANASEL);mycom.myfile = _f;mycom.fileIndex = _fileIndex;mycom.dispatch();}


myComplete是自己写的事件,参数为:

public var myfile:FileReference;public var fileIndex:int;


在使用NewFileStruct时便可以监听myComplete事件来达到传递fileIndex参数的目的。

原创粉丝点击