【问题标题】:Dyanmically updating Legends - ActionScript 3动态更新图例 - ActionScript 3
【发布时间】:2009-08-25 22:40:16
【问题描述】:

我在更新使用动作脚本创建的图例时遇到了一些问题。

请阅读以下步骤以了解问题。

  1. 创建了一个包含两个数据系列的折线图。
  2. 创建了一个图例。
  3. 将图表和图例附加到容器中。

  4. 有一个更新按钮。点击按钮。

  5. 现在折线图已更新为三个数据系列。
  6. 当我尝试更新图例时,它仍然指向带有两个标签而不是三个标签的初始值。

  7. 我用来实现的代码(六)

选项(1)

this["containerId"].getChildByName("legendName").dataProvider = LineChart(this["containerId"].getChildByName("chartName"));

选项(2)

this["containerId"].getChildByName("legendName").dataProvider = this["containerId"].getChildByName("chartName") as LineChart;

有没有cmets?

谢谢 周杰伦

【问题讨论】:

  • 好的。问题是因为缺少更新图表系列属性的代码!!! chartInst.series = newSeries;每次更新图表的数据提供程序时,虽然我注意到图表组件中的数据系列会自动更新,但看起来我们必须为图表的图例创建一组新的系列才能理解更新。因此,在设置 Legend 的 dataProvider 之前,创建一个新系列并将其设置为 Chart 的 series 属性。谢谢

标签: actionscript-3 flex3 charts legend


【解决方案1】:

大约 1 年前,我使用 Flex 图表进行了一些繁重的工作,但它们经常会让人感到沮丧。事实上,他们的内心非常聪明,因此很难对行为进行推理。

我注意到的一件事是,有时当您更改数据时,它实际上可能需要几帧才能在层次结构中涓涓细流。即使您在更新系列信息时在同一帧上更新图例上的dataProvider,您也可能不会绑定到正确版本的实例,因为它会在几帧内发生变化。 (即Series 的更改是异步的,dataProvider 的更改是同步的)。

检查这是否是您的问题的一个快速测试就是设置一个黑客计时器。将其设置为 100 毫秒左右,然后再设置您的 dataProvider ——希望当对 Series 的更改已经达到必要的属性时。另一个想法是使用第二个按钮,一旦您直观地看到新的Series,使用该按钮触发图例dataProvider 的分配。这不是一个生产就绪的解决方案,但它至少可以确定问题的性质。

如果是您的问题(我怀疑但不确定),则开始查找来自所有图表组件的事件。表示新Series 已绘制的事件可能来自任何地方,但您最终会找到它。祝你好运。


还有,两者的区别:

var foo:Bar = Bar(obj); // if !(obj is Bar) throw Error

var foo:Bar = obj as Bar; // if !(obj is Bar) return null

如果您确定obj 将转换为Bar,则第一个是最好的,如果不是,它将抛出异常(事实上,如果它没有转换为@ 987654333@)。第二个 (as) 用于当有合理的机会 obj 不会是 Bar 并且它不会抛出错误而是会返回 null

由于这种行为,Adobe 建议尽可能使用第一个表单。

【讨论】:

  • 没有运气尝试 a) setTimeout 函数调用来设置 Legend 的数据提供者。 b) 添加一个分配了 eventHandler 的新按钮,该按钮负责将数据提供者分配给 Legend 的实例。在上述两种情况下,我注意到 dataProvider (chartInstance) 指向初始值而不是更新的实例。一旦我解决了这个问题,就会更新你。谢谢杰
【解决方案2】:

这是 flex 的一个主要问题:它很难与 AS3 一起使用......最好使用 MXML 并创建绑定......这个问题应该会消失......

我不完全理解的一件事是,为什么一个孩子是另一个孩子的数据提供者,但也许您的应用程序的布局说明了这一点......通常,数据提供者来自应用程序的数据模型......


编辑: 我认为,绑定是最好的方法...... 您应该按如下方式创建一个类:

class Data {
    [Bindable(event="legendChanged")]
    public function get legend():LegendType {/*implementation*/}
    [Bindable(event="chartChanged")]
    public function get chart():ChartType {/*implementation*/}
    public function choseGraph(index:uint):void {
         //update state so the getters for chart and legend will return the right values
         this.dispatchEvent(new Event("legendChanged"));
         this.dispatchEvent(new Event("chartChanged"));
    }    
}

然后将你的视图绑定到它。

【讨论】:

  • 嗨,可绑定的数据提供者在这里没有多大帮助,因为我必须在一个页面中处理大约 50-60 个图表并且必须动态生成它们。以下是我维护的结构 每当输入发生变化时,我都会检索相关图表并更新数据系列和图例。希望,我已经给你一个明确的解释。 -杰
猜你喜欢
  • 1970-01-01
  • 2012-07-15
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 2014-03-08
相关资源
最近更新 更多