Обновить 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?


person GoVeM    schedule 23.12.2011    source источник


Ответы (2)


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

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

person prismaticorb    schedule 03.02.2012

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

person jamesTheProgrammer    schedule 23.12.2011
comment
Да, flex общается удаленно. Но даже если я получаю новые данные с сервера или локально, я думаю, что проблема на стороне клиента. Мне нужно какое-то обновление () или перерисовка () после того, как я добавлю новый BarSeries. - person GoVeM; 26.12.2011