2011-12-23 2 views
0

первый вопрос здесь.
У меня есть BarChart показывает несколько обычных баров и BarSeries, как это:Обновите 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

Короткий ответ использовать этот код:

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

длинный ответ, чтобы дать вам понимание того, как это работает:

Путь прогибается знает, когда, чтобы обновить пользовательский интерфейс компонент, который поддерживается данными, например диаграмма, находится в свойстве 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(); 
} 

Обратите внимание, что соответствующие «недействительными» методы вызываются в конце метода набора. Если вы скажете barChart.series.push(x), метод set series никогда не вызывается, только getter. Поэтому, чтобы заставить диаграмму знать, что произошла смена серии, вам нужно назначить новое значение для этой серии.

Стоит отметить, что даже присваивая себе ряд вызовет Invalidate, хотя это не является хорошим кодирования barChart.series = barChart.series

0

Flex взаимодействует с сервером удаленно, правильно? Вероятно, вам нужно сделать еще один явный вызов контроллеру приложения, который является гибким.

+0

Да, флекс общается удаленно. Но даже если я получаю новые данные с сервера или локально, я думаю, что проблема на стороне клиента. Мне нужно какое-то обновление() или redraw() после добавления новых BarSeries. – GoVeM

Смежные вопросы