zoukankan      html  css  js  c++  java
  • (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,就能得到我们想要的数据,之后再执行我们的保存方法,该功能即可实现。之后将数据传到后台,至于怎么去解析数据,后面找机会再出心得。谢谢

  • 相关阅读:
    OA日志模块
    OA查找用户
    在服务器注入脚本,然后客户端异步调用
    在使用ext2.0中使用store加载数据出现this.onMetaChange has no properties错误
    有关在div中的嵌套事件
    KML添加自定义数据
    KML 入门
    PostGIS中的shp2pgsql
    DOM基础
    jquery 操作 select,radio,checkbox等(转载)
  • 原文地址:https://www.cnblogs.com/zijianhua/p/5704161.html
Copyright © 2011-2022 走看看