• (FLEX)AS3,for循环里面加监听,只能取到最后一个元素的取巧方法解决方法


    首先申明,本人第一次写博客,不足之处还望大家见谅和不吝赐教,谢谢。

    背景是这样的:由于项目需要,flex中实现批量导入多个文件(.txt,.dat,...),解析数据并保存到数据库中。 

    采用FileReferenceList 实现多个文件导入。自然用到filelist.browse()以及file.load()。由于load()加载还未完成,继续for循环,导致最后循环结束时,取到的file.data是最后一个元素的。下面先列出修改之前的代码:

    private var file:FileReference = new FileReference();
    private var filelist:FileReferenceList= new FileReferenceList();
    private var filter:FileFilter = new FileFilter("请选择文件(*.dat)","*.dat");
    private var filedatas:ArrayCollection = new ArrayCollection([]);
    
    
    protected function init(event:FlexEvent):void{
    	filelist.addEventListener(Event.SELECT, file_select);
    }
    
    /**
     * 选择excel文件
     */
    private function click_BrowseXLS(event:MouseEvent):void
    {
    	filedatas.removeAll();
    	filelist.browse([filter]);
    }
    
    // 选择 文件,加载文件
    private function file_select(e:Event):void{
    	for(var i:int=0;i<filelist.fileList.length;i++){
    		file = filelist.fileList[i];
    		file.load();
    		file.addEventListener(Event.COMPLETE,file_complete);
    	}
    	//调用保存方法
    	filelists_complete();
    }
    
    protected function file_complete(e:Event):void{
    	var obj:Object= new Object();
    	obj.fileName = file.name;
    	obj.fileSize = file.size;
    	obj.fileType = file.type;
    	obj.fileRefrence = file.data;
    	filedatas.addItem(obj);					
    }
    
    //保存方法
    protected function filelists_complete():void{
    	//相关保存操作
    };
    

      在网上找了很久,解决方案都比较少,或者更多的是基于swf或者图片操作的。结合网上的一些帖子,最终觉得采用针对每一个文件,都新生成一个file对象,当所有的file都加载完成之后,再来执行我们的保存方法,具体代码如下:

    private var filelist:FileReferenceList= new FileReferenceList();
    private var filter:FileFilter = new FileFilter("请选择文件(*.dat)","*.dat");
    private var filedatas:ArrayCollection = new ArrayCollection([]);
    private var s:int = 0;//用于判断文件是否全部加载(load)完
    
    
    protected function init(event:FlexEvent):void{
    	filelist.addEventListener(Event.SELECT, file_select);
    }
    
    /**
     * 选择excel文件
     */
    private function click_BrowseXLS(event:MouseEvent):void
    {
    	s = 0;
    	filedatas.removeAll();
    	filelist.browse([filter]);
    }
    
    // 选择 文件,加载文件
    private function file_select(e:Event):void{
    	for(var i:int=0;i<filelist.fileList.length;i++){
    		var file:FileReference = FileReference(filelist.fileList[i]);
    		file.load();
    		file.addEventListener(Event.COMPLETE,file_complete);
    	}
    	//调用保存方法
    	filelists_complete();
    }
    
    protected function file_complete(e:Event):void{
    	//被调用  filelist.fileList.length  次之后,即所有文件都加载完成之后,才调用加载数据的方法
    	s = s + 1;
    	if(s == filelist.fileList.length){
    		for(var i:int=0;i<filelist.fileList.length;i++){
    			var f:FileReference = FileReference(filelist.fileList[i]);
    			var obj:Object= new Object();
    			obj.fileName = f.name;
    			obj.fileSize = f.size;
    			obj.fileType = f.type;
    			obj.fileRefrence = f.data;
    			filedatas.addItem(obj);
    		}
    	}
    }
    
    //保存方法
    protected function filelists_complete():void{
    	//相关保存操作
    };
    

     对比前后代码不难发现,其实我们就是在监听完成方法file_complete()里面,加上一个判断。如果选中了N个文件,如果该方法已经被调用了N,就意味着所有文件都已经load(加载)完成,然后我们再循环一次所有的文件,分别取到f.data,就能得到我们想要的数据,之后再执行我们的保存方法,该功能即可实现。之后将数据传到后台,至于怎么去解析数据,后面找机会再出心得。谢谢

  • 相关阅读:
    centos7.9安装mysql,远程无法连接的问题
    netcore 自定义脚手架
    mongodb查询出某个字段最大值
    解决Docker容器内不能使用vim命令的问题
    git 撤销修改和版本回退
    【转】一文读懂PCA算法的数学原理
    【转】Maximal Information Coefficient (MIC)最大互信息系数详解与实现
    【转】带约束的多目标优化进化算法综述
    论文快报-2021-10-Multi-task optimization and evolutionary multitasking
    【Vegas原创】SQL Server数据库备份、差异备份、日志备份脚本
  • 原文地址:https://www.cnblogs.com/zijianhua/p/5704161.html
Copyright © 2020-2023  润新知