这里的第一个问题 我有一个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后,有没有办法刷新图表?
答案 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