Apache flex 当数据添加到Flex图表的数据提供程序时,如何刷新Flex图表?

Apache flex 当数据添加到Flex图表的数据提供程序时,如何刷新Flex图表?,apache-flex,air,charts,Apache Flex,Air,Charts,现在我必须在这里遗漏一些东西,因为这似乎是任何“Flex图表入门”教程都会解决的一个非常基本的问题。然而,我所能找到的只是提示,每当数据提供者发生变化时,图表应该自动更新。注意,提示 这是我的标记: <?xml version="1.0" encoding="utf-8"?> <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" title="econemon Se

现在我必须在这里遗漏一些东西,因为这似乎是任何“Flex图表入门”教程都会解决的一个非常基本的问题。然而,我所能找到的只是提示,每当数据提供者发生变化时,图表应该自动更新。注意,提示

这是我的标记:

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

这是我的动作脚本的一部分:

[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);
}
[Bindable]
公共变量xmlDataTest:数组=[
{dt:“1230908694”,fltValue:“50.4”},
// ...
{dt:“1230909594”,FLT值:“35.4”}
]
公共变量dflt:Number=10.0;
公共变量timData:定时器=新定时器(3000);
// ...
公共函数vDataStart():void
{
如果(!timData.running){
timData.addEventListener(TimerEvent.TIMER,vAppendDatum);
timData.start();
}
}
公共函数vDataStop():void
{
if(timData.running){
timData.stop();
}
}
公共功能vAppendDatum(evt:事件):无效
{
var-dtNew:字符串;
var fltNew:字符串;
var fltT:数字;
dtNew=String(数字(xmlDataTest[xmlDataTest.length-1].dt)+100);
fltT=数字(xmlDataTest[xmlDataTest.length-1].fltValue);
如果(fltT<10.0 | | fltT>70){
dflt*=-1;
}
fltNew=字符串(fltT+dflt);
push({dt:dtNew,fltValue:fltNew});
//跟踪(“Datenpunkte:+xmlDataTest.length);
}
单击“开始”按钮时,数据数组每3秒扩展一次,但屏幕上的图表保持不变。

请查看。在Flex中,所有数据结构类(如
Array
)都有相应的集合(或CollectionView)类作为包装器。当您使用诸如
addItem()
之类的包装函数时,它会向任何侦听的对象发送事件,以通知它们集合已更改。您需要将数据提供程序设置为包装
xmlDataTest
ArrayCollection
实例


编辑:另外,由于我最初不太清楚,您需要通过ArrayCollection包装器对数组进行所有操作。对基础数据所做的任何更改,如果没有通过该接口,则系统的其他部分无法了解。

我认为将其设置为Rmador描述的ArrayCollection是正确的

您可以通过调用PlotChart的
refreshBindings()
方法来解决此问题,方法如下:
idOfPlotChart.refreshBindings()
vAppendDatum
函数中更新数据后