#actionscript-3 #flex4 #dataprovider #series #linechart
#actionscript-3 #flex4 #dataprovider #Серии #линейная диаграмма
Вопрос:
У меня есть линейная диаграмма в flex с осью даты и времени. Я устанавливаю dataprovider на эту линейную диаграмму через actionscript. График будет отрисован. Проблема возникает, когда я присваиваю null поставщику данных, чтобы график стал пустым.
Фактический код выглядит аналогично приведенному ниже коду :
var actualValues:XMLList=flowChartDP.upFlows;
var localSeries1:LineSeries = new LineSeries();
localSeries1.dataProvider = actualValues;
localSeries1.yField = "flow";
localSeries1.xField = "time";
localSeries1.setStyle("form","curve");
var currentSeries1:Array =lineChart.series;
currentSeries1.push(localSeries1);
lineChart.series = currentSeries1;
var actualValues2:XMLList=flowChartDP.downFlows;
var localSeries2:LineSeries = new LineSeries();
localSeries2.dataProvider = actualValues2;
localSeries2.yField = "flow";
localSeries2.xField = "time";
localSeries2.setStyle("form","curve");
var currentSeries2:Array =lineChart.series;
currentSeries2.push(localSeries2);
lineChart.series = currentSeries2;
И я добавлю еще две серии точно таким же образом к линейной диаграмме.Хотя я думаю, что это не лучший способ написания кода, этот работает нормально.
Проблема заключается в сбросе графика.
У меня есть кнопка, которая при нажатии выполняет: LineChart.dataprovider= null; LineChart.series= null;
Но мой flash player (версия отладчика FP 10) выдает следующую ошибку
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at mx.charts::AxisRenderer/measureHorizontalGutters()[E:dev4.0.0frameworksprojectsdatavisualizationsrcmxchartsAxisRenderer.as:2275]
at mx.charts::AxisRenderer/calcRotationAndSpacing()[E:dev4.0.0frameworksprojectsdatavisualizationsrcmxchartsAxisRenderer.as:1889]
at mx.charts::AxisRenderer/adjustGutters()[E:dev4.0.0frameworksprojectsdatavisualizationsrcmxchartsAxisRenderer.as:1565]
at mx.charts.chartClasses::CartesianChart/updateAxisLayout()[E:dev4.0.0frameworksprojectsdatavisualizationsrcmxchartschartClassesCartesianChart.as:2133]
at mx.charts.chartClasses::CartesianChart/updateDisplayList()[E:dev4.0.0frameworksprojectsdatavisualizationsrcmxchartschartClassesCartesianChart.as:1391]
at mx.core::UIComponent/validateDisplayList()[E:dev4.0.0frameworksprojectsframeworksrcmxcoreUIComponent.as:8531]
at mx.managers::LayoutManager/validateDisplayList()[E:dev4.0.0frameworksprojectsframeworksrcmxmanagersLayoutManager.as:663]
at mx.managers::LayoutManager/doPhasedInstantiation()[E:dev4.0.0frameworksprojectsframeworksrcmxmanagersLayoutManager.as:736]
at mx.managers::LayoutManager/doPhasedInstantiationCallback()[E:dev4.0.0frameworksprojectsframeworksrcmxmanagersLayoutManager.as:1072]
Каково решение? Он не выдает ошибку, когда
lineChart.series=null;
удалено. Но утверждение
lineChart.dataprovider=null;
также не делает диаграмму пустой.
Ответ №1:
Ниже приведено простое приложение, которое я создал, чтобы воссоздать вашу проблему. Установка для dataProvider значения null очищает диаграмму без каких-либо исключений для меня. Запустите его и посмотрите. Я говорю, что ваша проблема где-то в другом месте.
<?xml version="1.0" encoding="utf-8"?>
<s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" >
<fx:Script><![CDATA[
import mx.collections.ArrayCollection;
[Bindable]
public var expenses:ArrayCollection = new ArrayCollection([
{Month:"Jan", Profit:2000, Expenses:1500, Amount:450},
{Month:"Feb", Profit:1000, Expenses:200, Amount:600},
{Month:"Mar", Profit:1500, Expenses:500, Amount:300}
]);
protected function button1_clickHandler(event:MouseEvent):void
{
myChart.dataProvider = null;
}
]]></fx:Script>
<s:layout>
<s:VerticalLayout />
</s:layout>
<mx:Panel title="Line Chart">
<mx:LineChart id="myChart"
dataProvider="{expenses}"
showDataTips="true"
>
<mx:horizontalAxis>
<mx:CategoryAxis
dataProvider="{expenses}"
categoryField="Month"
/>
</mx:horizontalAxis>
<mx:series>
<mx:LineSeries
yField="Profit"
displayName="Profit"
/>
<mx:LineSeries
yField="Expenses"
displayName="Expenses"
/>
</mx:series>
</mx:LineChart>
<mx:Legend dataProvider="{myChart}"/>
</mx:Panel>
<s:Button click="button1_clickHandler(event)" label="Clear" />
</s:Application>
Комментарии:
1. Я создаю ряды в потоке динамически и также назначаю поставщикам данных ряд.
2. Независимо от того, создается ли она динамически или устанавливается во время выполнения, если в Flex нет ошибки, что случается редко, оба должны работать одинаково. Весь этот код в любом случае преобразуется в ActionScript при компиляции. Можете ли вы обновить свой вопрос соответствующим кодом? Покажите код для кнопки.
3. Поставщики данных являются объектами XML-списка. Например, var actualValues:XMLList=flowChartDP.flows; var localSeries1:LineSeries = new LineSeries(); localSeries1.dataProvider = actualValues; localSeries1. yField = «поток»; localSeries1.xField = «время»; localSeries1.setStyle(«форма», «кривая»); переменная currentSeries1:Array = LineChart.series; currentSeries1.push(localSeries1); LineChart.series = currentSeries1;
4. И я добавлю еще три серии точно таким же образом к линейной диаграмме. Код линейной диаграммы <mx:LineChart width=»100%» height=»94%» id=»Линейная диаграмма» dataProvider=»{flowChartDP}» showDataTips=»true» FontSize=»12″ color=»#000000″>
5. Я обновил вопрос Ранхиру. Спасибо, что занялись этим вопросом. Я также проверял это на примере, подобном вашему, и он работает нормально. Итак, я сейчас изучаю свой код. Надеюсь, обновленный вопрос еще немного прояснит проблему..