Ошибка FlexC AreaChart - PullRequest
       3

Ошибка FlexC AreaChart

1 голос
/ 09 ноября 2011

Что случилось с ошибкой AreaChart во Flex, кто-нибудь знает, как ее исправить? Это заставляет одни всплывающие подсказки отображать неправильное значение для minFields.

т.е. для:

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

Покажет:

Total Cost
high: TotalVariableCost
low: TotalVariableCost

В отличие от:

Total Cost
high: TotalVariableCost
low: TotalFixedCost

Предполагается, что эта ошибка в строках с 2058 по 2083 из AreaSeries.as - но это далеко за пределами моего понимания.

- Стивен

1 Ответ

1 голос
/ 01 марта 2012

Да, это ошибка в AreaSeries. Из-за глупого способа разработки гибких диаграмм единственный реальный способ исправить это - установить пользовательский dataTipFunction на AreaChart.

Вот копия соответствующего кода с исправленной ошибкой:

/**
 * 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>
...