flex4 动态获取对象属性,动态生成数据源,动态生成lineChart,清除数据。

本文介绍如何使用ArrayCollection动态生成线图数据源,包括新增数据、更新已有数据和移除数据的过程。通过创建动态对象并获取其属性,实现灵活的数据管理,最终根据数据源动态生成线图系列并添加至图表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.该图表的数据源为ArrayCollection类型的arrayC
2.每增加一条线,其实就是增加一个数据源中的ArrayCollection每个对象的一个属性,且属性名不能重复
3.修改ArrayCollection后,同时修改LineChart的series




实例中,新增,即为新增一个line的数据ArrayCollection,里面对象的结构为 ,时间Date,设备名称(“设备+随机数”),时间的值是1-12小时,设备名称的值是一个随机数

[html]  view plain copy
  1. <span style="color:#006600;">           private  function createArray():ArrayCollection{  
  2.                 var ac:ArrayCollection = new ArrayCollection();  
  3.                 var name:String = "设备"+ Math.floor(Math.random()*10);  
  4.                    
  5.                 for(var i:int=0;i<12;i++){  
  6.                     var o:Object = new Object();  
  7.                     o.Date = i+"时";  
  8.                     o[name] =  Math.floor(Math.random()*10);  
  9.                     ac.addItem(o);  
  10.                 }  
  11.                   
  12.                 return ac;  
  13.             }   
  14. </span>  



而后判断,如果是新增line,直接将该ArrayCollection作为lineChart的数据源;否则修改lineChart的数据源,将新增line设备名称属性,作为lineChart的数据源的一个新属性
此时出现的问题是,新增一个line的数据ArrayCollection的对象除了时间Date是固定的,其他属性(设备名称) 其实是动态生成的,也就说,这是个动态对象。要获取动态对象的属性方法如下
[html]  view plain copy
  1. <span style="color:#006600;">           /** 返回对象的某个属性名称  
  2.              * @author kkkloveyou 2012-10-23  
  3.              * @param obejct  动态对象  
  4.              * @param index 要获取第几个对象的属性  
  5.              * @return name  
  6.              */  
  7.             public function getObjectProperties(obejct:Object,index:int):String{  
  8.            
  9.                 var objInfo:Object = ObjectUtil.getClassInfo(obejct);   
  10.     
  11.                 //获取到对象的属性列表  
  12.                 var fieldName:Array = objInfo["properties"] as Array;   
  13.    
  14.                 return fieldName[index];  
  15.             }</span>  


ObjectUtil 类是一个全静态类,["properties"]可以返回对象属性的数组,只要知道属性在对象中的排位,就可以获得该属性名 ,动态生成数据源如下:
[html]  view plain copy
  1. /*判断 数据源是否为空,为空直接放入第一个ArrayCollection对象  ,否则 将自己的第二个属性值加入到数据源中*/  
  2.                 if(arrayC.length>0){  
  3.                     var newAc:ArrayCollection = createArray();  
  4.                     for(var a:String in arrayC){  
  5.                         for(var b:String in newAc){  
  6.                             if(arrayC[a].Date ==    newAc[b].Date){  
  7.                                 var name :String = getObjectProperties(newAc[b] ,1);  
  8.                                 arrayC[a][name] = newAc[b][name];  
  9.                                 trace("增加属性:"+newAc[b][name]);  
  10.                                 break;  
  11.                             }  
  12.                         }         
  13.                     }  
  14.                 }else{  
  15.                     arrayC = createArray();   
  16.                 }  
  17.                   
  18.                 /*根据数据源动态生成线*/  
  19.                 /*1.取出每个要增加对象的属性 name   */  
  20.                 /* 拿到ArrayCollection的第一个对象,就可以拿到他的所有属性名*/  
  21.                 var obejct:Object = arrayC.getItemAt(0);  
  22.                 var objInfo:Object = ObjectUtil.getClassInfo(obejct);   
  23.                 var fieldNames:Array = objInfo["properties"] as Array;   
  24.                 var newFileNames:Array = [];  
  25.                 for each(var q:String in fieldNames){   
  26.                     if(q!="Date"){  
  27.                         newFileNames.push(q);  
  28.                     }  
  29.   
  30.   
  31.                 }    


数据源更新了以后,只需要按照数据源arrayC中对象属性名,生成相应的LineSeries,并将LineSeries  添加到LineChart的series即刻
[html]  view plain copy
  1. <span style="color:#006600;">               /*2.根据name  取出相应  对象值*/  
  2.                   
  3.                 array = [];  
  4.                 for(var b:String in newFileNames){  
  5.                     var lineSeries:LineSeries=new LineSeries();  //设置图表的系列  
  6.                     lineSeries.xField="Date"  
  7.                     lineSeries.yField = newFileNames[b];  
  8.                     lineSeries.displayName = newFileNames[b];  
  9.                     lineSeries.setStyle("form", "curve");    
  10.                     //lineSeries.setStyle("lineStroke",s1);  
  11.                     //替换或者新增  
  12.                     array.push( lineSeries );  
  13.                 }  
  14.                
  15.                 myChart.series = array;//给图表系列赋值</span>  




移除一条line的过程是相反的,也是类似,首先修改数据源的arrayC,将要移除的属性删除,而后相应的修改myChart.series
[html]  view plain copy
  1. /** 移除数据  
  2.              * @author kkkloveyou 2012-10-23  
  3.              * @return name 要删除的属性名  
  4.              */  
  5.             private function removeFromArray(name:String):void{  
  6.                   
  7.                 for(var a:String in arrayC){  
  8.                     trace("删除属性:"+arrayC[a][name]);  
  9.                     delete arrayC[a][name];  
  10.                 }  
  11.                   
  12.                 array = [];  
  13.                 for(var b:String in myChart.series){  
  14.                     if(myChart.series[b].yField !=name){  
  15.                         array.push(myChart.series[b]);  
  16.                            
  17.                     }  
  18.                 }  
  19.                 myChart.series = array ;  
  20.       
  21.                 legend_id.dataProvider = myChart;  
  22.                
  23.             }  
  24. 完整实例 下载 地址:http://download.youkuaiyun.com/detail/kkkloveyou/4705198
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值