Как сделать обновление Flex Chart при добавлении данных в его dataProvider? - PullRequest
0 голосов
/ 03 января 2009

Теперь я должен что-то упустить здесь, так как это кажется очень простой проблемой, которая будет решена в любом учебном пособии «Начало работы с Flex-графикой». Однако все, что я мог найти, это намеки на то, что диаграмма должна обновляться автоматически при изменении dataProvider. Имейте в виду, намеки.

Это моя разметка:

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" title="econemon Sensor Simulator">
    <!-- ... -->
    <mx:Script source="SimulatorFunctions.as" />
    <mx:HDividedBox left="0" top="0" bottom="0" right="0">
        <!-- ... -->
        <mx:VDividedBox width="75%" height="100%">
            <mx:PlotChart width="100%" height="33%" dataProvider="{xmlDataTest}">
                <mx:horizontalAxis>
                    <mx:DateTimeAxis dataUnits="seconds" displayLocalTime="true" parseFunction="dtFromUnixtime"/>
                </mx:horizontalAxis>
                <mx:series>
                    <mx:LineSeries xField="dt" yField="fltValue" displayName="Testkurve" />
                </mx:series>
            </mx:PlotChart>
            <mx:Panel width="100%" height="66%">
                <mx:Button label="Start" click="vDataStart()" />
                <mx:Button label="Stop" click="vDataStop()" />
            </mx:Panel>
        </mx:VDividedBox>
    </mx:HDividedBox> 
</mx:WindowedApplication>

И это часть моего ActionScript:

[Bindable]
public var xmlDataTest:Array = [
        { dt: "1230908694", fltValue: "50.4" },
        // ...
        { dt: "1230909594", fltValue: "35.4" }
]

public var dflt:Number = 10.0;
public var timData:Timer = new Timer(3000);

// ...

public function vDataStart():void
{
    if (!timData.running) {
        timData.addEventListener(TimerEvent.TIMER, vAppendDatum);
        timData.start();
    }
}

public function vDataStop():void
{
    if (timData.running) {
        timData.stop();
    }
}

public function vAppendDatum(evt:Event):void
{
    var dtNew:String;
    var fltNew:String;
    var fltT: Number;
    dtNew = String(Number(xmlDataTest[xmlDataTest.length - 1].dt) + 100);
    fltT = Number(xmlDataTest[xmlDataTest.length - 1].fltValue);
    if (fltT < 10.0 || fltT > 70) {
        dflt *= -1;
    }
    fltNew = String(fltT + dflt);
    xmlDataTest.push({ dt: dtNew, fltValue: fltNew });
    //trace("Datenpunkte: " + xmlDataTest.length);
}

При нажатии кнопки «Пуск» массив данных расширяется каждые 3 секунды, но диаграмма на экране остается прежней.

Ответы [ 2 ]

7 голосов
/ 03 января 2009

Взгляните на это . Во Flex все классы структуры данных (например, Array) имеют соответствующие классы Collection (или CollectionView), которые действуют как оболочки. Когда вы используете функции-оболочки, такие как addItem(), он отправляет событие любому слушающему, чтобы уведомить их об изменении коллекции. Вы захотите установить для dataProvider экземпляр ArrayCollection, который охватывает xmlDataTest.

EDIT : также, поскольку я изначально не совсем понял, вам нужно будет all управлять массивом через оболочку ArrayCollection. Любые изменения, внесенные в базовые данные, которые не проходят через этот интерфейс, о которых остальная система не может знать.

1 голос
/ 03 января 2009

Я считаю, что сделать ArrayCollection, как описывает rmeador, правильно.

Вы можете обойти эту проблему, вызвав метод refreshBindings() PlotChart следующим образом: idOfPlotChart.refreshBindings(); после обновления данных в функции vAppendDatum.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...