0

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

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

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

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

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

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

选项1)

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

选项 (2)

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

任何意见?

谢谢杰

4

2 回答 2

0

大约 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将转换为 a Bar,则第一个是最好的,如果不是,它将抛出异常(实际上,如果它没有转换为 a ,它将是一个错误Bar)。第二个 ( as) 用于当有合理的机会obj不会是 aBar并且它不会抛出错误而是会返回时null

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

于 2009-08-26T01:31:46.420 回答
0

这是 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"));
    }    
}

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

于 2009-08-26T01:11:49.823 回答