Wie mache ich eine Flex -Diagramm -Aktualisierung, wenn Daten zu ihrem DataProvider hinzugefügt werden?

StackOverflow https://stackoverflow.com/questions/408139

  •  03-07-2019
  •  | 
  •  

Frage

Jetzt muss ich hier etwas fehlen, da dies ein sehr grundlegendes Problem erscheint, das in jedem Tutorial "Erste Schritte mit Flex -Charting" behandelt wird. Alles, was ich finden konnte, war jedoch Hinweise darauf, dass das Diagramm automatisch aktualisiert werden sollte, wenn sich der DataProvider ändert. Wohlgemerkt, Hinweise.

Dies ist mein Markup:

<?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>

Und dies ist Teil meines ActionScripts:

[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);
}

Wenn Sie auf die Schaltfläche "Start" klicken, wird das Datenarray alle 3 Sekunden erweitert, aber das Diagramm auf dem Bildschirm bleibt gleich.

War es hilfreich?

Lösung

Sich ansehen Dies. In Flex alle Datenstrukturklassen (wie z. Array) haben entsprechende Sammlungsklassen (oder Sammelansicht), die als Verpackungen fungieren. Wenn Sie die Wrapper -Funktionen verwenden, z. addItem(), Es entsendet ein Ereignis auf alles, was sie zuhört und sie benachrichtigt. Die Sammlung hat sich geändert. Sie möchten den DataProvider auf eine Instanz festlegen ArrayCollection das wickelt sich xmlDataTest.

BEARBEITEN: Da ich ursprünglich nicht ganz klar war, müssen Sie es tun alle Ihre Manipulation des Arrays durch den ArrayCollection -Wrapper. Alle Änderungen an den zugrunde liegenden Daten, die diese Schnittstelle nicht durchlaufen. Der Rest des Systems hat keine Möglichkeit zu wissen.

Andere Tipps

Ich glaube, es ist korrekt, es zu einer ArrayCollection zu machen, wie Rmeador beschreibt.

Möglicherweise können Sie das umgehen, indem Sie das anrufen refreshBindings() Methode des Plotchart wie diesem: idOfPlotChart.refreshBindings(); Nachdem die Daten in Ihrem aktualisiert wurden vAppendDatum Funktion.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top