Обновить BarChart после добавления BarSeries - PullRequest
0 голосов
/ 23 декабря 2011

первый вопрос здесь.
У меня есть 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 голосов
/ 03 февраля 2012

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

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

ДОЛГО ответ, чтобы дать вам понимание того, как это работает:

Способ, которым Flex знает, когда обновлять компонент пользовательского интерфейса, для которого создаются данные, такие как диаграмма, заключается в свойстве 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. Если вы говорите barChart.series.push(x), метод set series никогда не вызывается, только getter. Поэтому, чтобы заставить диаграмму узнать, что в серии произошли изменения, необходимо присвоить серии новое значение.

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

0 голосов
/ 23 декабря 2011

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

...