2009-08-25 42 views
0

我在更新使用操作脚本创建的图例时遇到了一些问题。更新传奇 - ActionScript 3

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

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

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

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

  7. 我用来实现(6)

选项(1)

此[ “数据筒”]。getChildByName( “legendName”)。dataProvider中=应用于LineChart(此[”的代码数据筒 “] getChildByName。(” chartName“));

选项(2)

此[ “数据筒”] getChildByName( “legendName”)的dataProvider =此[ “数据筒”] getChildByName( “chartName”)作为应用于LineChart。;

有何评论?

感谢 周杰伦

+0

好的。这个问题是因为缺少更新Chart系列属性的代码! chartInst.series = newSeries; 每当更新图表的数据提供者时,虽然我注意到图表组件中的数据系列会自动更新,但看起来我们必须为图表的图例创建一组新的系列来理解更新。 因此,在设置Legend的dataProvider之前,请创建一个新系列并将其设置为Chart的系列属性。 感谢 – Jay 2009-08-26 20:45:43

+0

答案更新中...格尔茨 – back2dos 2009-08-28 16:50:10

回答

0

这是柔性的一个重大问题:这是很难用AS3使用...更好地与MXML去创建绑定...问题可能应该走...

的事情我不完全理解的是,为什么一个孩子是数据提供程序到另一个,但也许你的应用程序的布局,使得清楚了......通常的dataProvider来自应用程序的数据模型......


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

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

,然后绑定你的看法吧。

+0

嗨, 可绑定的dataProvider也不会有多大效果在这里,因为我要处理约50-60图表在一个单独的页面,并动态地生成它们。 以下是结构我保持 每当有输入中的一些变化,我检索相关图表并更新数据系列和图例。 希望,我已经给你一个明确的解释。 -Jay – Jay 2009-08-26 06:25:14

0

大约一年前,我用Flex图表做了一些繁重的工作,它们可能是一个持续不断的挫折来源。事实是,他们内心非常聪明,导致很难推理行为。

我注意到的一件事是,有时当您更改数据时,实际上可能需要几帧才能通过层次结构。即使您更新同一帧上的图例上的dataProvider,与更新系列信息时相比,您可能没有绑定到正确版本的实例,因为它会在几帧中更改。 (即,对Series的改变是异步的并且对dataProvider的改变是同步的)。

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

如果这是您的问题(我怀疑但不确定),那么就开始寻找来自所有图表组件的事件。发出新信号Series的事件可能来自任何地方,但最终会发现它。祝你好运。


此外,之间差异:如果你一定obj将转换为Bar,它会抛出如有异常

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

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

是第一个是最好的它不是(事实上,如果它没有投射到Bar那将是一个错误)。第二个(as)适用于存在合理机会的情况obj不会是Bar,它不会抛出错误,而是返回null

由于此行为,Adobe建议尽可能使用第一种形式。

+0

尝试着没有好运 a)setTimeout函数调用来设置Legend的数据提供者。 b)添加一个新的按钮,指派一个eventHandler负责将数据提供者分配给Legend的实例。 在上述两种情况下,我注意到dataProvider(chartInstance)指向初始值而不是更新的实例。 一旦我解决了这个问题,我会更新你。 谢谢 Jay – Jay 2009-08-26 06:28:27