添加BarSeries后刷新BarChart

时间:2011-12-23 13:57:53

标签: flex bar-chart

这里的第一个问题 我有一个BarChart显示几个普通条和一个BarSeries,如下所示:

<mx:BarChart id="barchart" dataProvider="{model.myList}" type="clustered">
    <mx:horizontalAxis>
        <mx:LinearAxis autoAdjust="true"/>
    </mx:horizontalAxis>
    <mx:verticalAxis>
        <mx:CategoryAxis categoryField="name"/>
    </mx:verticalAxis>
    <mx:series>
        <mx:BarSeries dataProvider="{model.myList}" xField="myValue"/>
    </mx:series>
</mx:BarChart>

当用户点击按钮时,我需要计算一些值,将它们放在“myCalculatedValue”上并添加另一个BarSeries作为比较。我这样做:

var barSerie:BarSeries = new BarSeries();
barSerie.dataProvider = model.myList;
barSerie.xField = "myCalculatedValue";
barchart.series.push(barSerie);

但BarChart根本没有变化。添加新的BarSeries后,有没有办法刷新图表?

2 个答案:

答案 0 :(得分:0)

Flex正在远程与服务器通信,对吗?您可能需要另外显式调用容纳flex的app控制器。

答案 1 :(得分:0)

简短的回答是使用此代码:

var barSerie:BarSeries = new BarSeries();
barSerie.dataProvider = model.myList;
barSerie.xField = "myCalculatedValue";
var allSeries:Array = barchart.series;
allSeries.push(barSerie);
barchart.series = allSeries;

LONG答案,让您了解其工作原理:

flex知道何时刷新数据支持的ui组件(例如图表)在function set dataProvider属性上,或等效(在本例中为series)。

以下是mx.charts.chartClasses.ChartBase的代码:

public function set series(value:Array /* of Series */):void
{
    value = value == null ? [] : value;
    _userSeries = value;

    var n:int = value.length;
    for (var i:int = 0; i < n; ++i)
    {
        if (value[i] is Series)
        {
            (value[i] as Series).owner = this;                
        }
    }

    invalidateSeries();
    invalidateData();
    legendDataChanged();
}

请注意,在set方法的末尾调用相关的“invalidate”方法。 如果您说barChart.series.push(x),则永远不会调用set series方法,只会调用getter。因此,为了强制图表知道系列发生了变化,您需要为该系列分配一个新值。

值得指出的是,即使将系列分配给自身也会导致无效,尽管编码效果不佳 barChart.series = barChart.series