2011-11-09 29 views
1

Flex的AreaChart錯誤是怎麼回事,有誰知道如何解決它?它會導致一些工具提示顯示minFields的錯誤值。Flex的AreaChart錯誤

I.e.爲:

<mx:AreaSeries yField="TotalVariableCost" minField="TotalFixedCost" displayName="Total Cost"> 

它會顯示:

Total Cost 
high: TotalVariableCost 
low: TotalVariableCost 

至於反對:

Total Cost 
high: TotalVariableCost 
low: TotalFixedCost 

此錯誤是假設2058是行AreaSeries.as的2083 - 但是,這東西超出了我的理解範圍。

--Stephen

+0

你以前問過同樣的問題嗎? http://stackoverflow.com/questions/7928266/patching-flexs-areachart-bug – takteek

回答

1

是的,這是AreaSeries中的一個錯誤。由於靈活圖表的設計很愚蠢,修復它的唯一方法是在AreaChart上設置一個自定義的dataTipFunction

下面是相關的代碼與固定的bug副本:

/** 
* Create a data tip function for the given AreaSeries. Uses a copy of 
* the formatDataTip code from AreaSeries with the minValue bug fixed. 
* 
* @param series 
* @return a data tip function 
* 
*/ 
private function createAreaSeriesTipFunc(series:AreaSeries):Function { 
    var displayName:String = series.displayName; 
    var dataTransform:DataTransform = series.dataTransform; 
    var xField:String = series.xField; 
    var minField:String = series.minField; 

    // formatDataTip relies on AreaSeries member data so simulate that 
    // with a closure to minimize code modifications 

    return function(hd:HitData):String { 
     var dt:String = ""; 
     var n:String = displayName; 
     if (n && n != "") 
     dt += "<b>"+ n + "</b><BR/>"; 

     var xName:String = dataTransform.getAxis(CartesianTransform.HORIZONTAL_AXIS).displayName; 
     if (xName == "") 
     xName = xField; 
     if (xName != "") 
     dt += "<i>" + xName + ": </i>"; 

     var item:AreaSeriesItem = AreaSeriesItem(hd.chartItem); 
     var lowItem:AreaSeriesItem = (minField != "") ? 
     item : 
     null; 
     dt += dataTransform.getAxis(CartesianTransform.HORIZONTAL_AXIS).formatForScreen(item.xValue) + "\n"; 

     var yName:String = dataTransform.getAxis(CartesianTransform.VERTICAL_AXIS).displayName; 

     if (!lowItem) 
     { 
     if (yName != "") 
      dt += "<i>" + yName + ":</i> "; 
     dt += dataTransform.getAxis(CartesianTransform.VERTICAL_AXIS).formatForScreen(item.yValue) + "\n"; 
     } 
     else 
     { 
     if (yName != "") 
      dt += "<i>" + yName + " (high):</i> "; 
     else 
      dt += "<i>high: </i>"; 
     dt += dataTransform.getAxis(CartesianTransform.VERTICAL_AXIS).formatForScreen(item.yValue) + "\n"; 

     if (yName != "") 
      dt += "<i>" + yName + " (low):</i> "; 
     else 
      dt += "<i>low:</i> "; 
     dt += dataTransform.getAxis(CartesianTransform.VERTICAL_AXIS).formatForScreen(lowItem.minValue) + "\n"; 
     } 

     return dt; 
    }; 
} 

我只是在一個地方改變formatForScreen(lowItem.yValue)formatForScreen(lowItem.minValue)。你可以這樣使用它:

<mx:AreaChart dataProvider="{chartData}" showDataTips="true" dataTipFunction="{createAreaSeriesTipFunc(areaSeries)}"> 
     <mx:series> 
     <mx:AreaSeries id="areaSeries" yField="TotalVariableCost" minField="TotalFixedCost" displayName="Total Cost" /> 
     </mx:series> 
</mx:AreaChart> 
+0

非常感謝!發佈這個到flex-dev希望有人會提交你的修復。 –