在flex中用chart对数据展示时,有时候数据中有空值,但是希望数据为空时能用其他默认值来代替,这个时候就可以用dataFunction来做对数据显示前的一个预处理。
<s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"
height="600">
<fx:Script><![CDATA[
import mx.charts.CategoryAxis;
import mx.charts.chartClasses.AxisBase;
import mx.charts.chartClasses.Series;
[Bindable]
public var SMITH:Array = [
{month: 1,High:45.87,Low:null,open:25.19},{month: 2,High:45.74,Low:10.23,open:35.29},{month: 3,High:45.77,Low:12.13,open:45.19},{month: null,High:46.06,Low:10.45,open:15.59},];
private function columnDataFunc(series:Series,item:Object,fieldName:String):Object {
if(fieldName == "yValue" && series.hasOwnProperty("yField"))
{
var yfield:String = series["yField"];
if(item[yfield] == null)
{
return 123;
}
//此时的返回值必须与数据类型相匹配。
return item[yfield];
}
else if(fieldName == "xValue")
{
var xfield:String = categoryAxis.categoryField;
//此时,必须返回为string类型的值,因为x轴为null时,chart控件会默认用此数据的index来代表,如果不为string的话,chart的图形会发生平移现象
//但是记得此时必须和categoryDataFunction中的返回逻辑一样
return item[xfield] != null ? item[xfield].toString() : "4";
}
else
{
return null;
}
}
private function categoryDataFunction(axis:AxisBase,item:Object):Object {
// 对数据源数据显示之前做处理,因为显示的时候都用string类型,所以可以返回任何类型
return item.month == null ? "4" : item.month;
}
protected function categoryAxisLabelFunction(item:Object,prevValue:Object,axis:CategoryAxis,categoryItem:Object):String
{
// labelFunction 仅仅决定显示的label的值
var showString:String = item.toString() + " -label";
return showString;
}
]]></fx:Script>
<s:layout>
<s:VerticalLayout/>
</s:layout>
<mx:ColumnChart id="chart" dataProvider="{SMITH}"
showDataTips="true" width="100%" height="100%">
<mx:horizontalAxis>
<!-- The dataFunction replaces "categoryField='month'. -->
<mx:CategoryAxis id="categoryAxis"
dataFunction="categoryDataFunction"
labelFunction="categoryAxisLabelFunction"
categoryField="month"/>
</mx:horizontalAxis>
<mx:series>
<!--
The dataFunction replaces yField value,which cannot drill down
into an object (close.High is not valid).
-->
<mx:ColumnSeries id="highClose" yField="High" maxColumnWidth="20" name="High"
dataFunction="columnDataFunc" />
<mx:ColumnSeries id="lowClose" yField="Low" maxColumnWidth="20" name="Low"
dataFunction="columnDataFunc" />
</mx:series>
</mx:ColumnChart>
</s:Application>
