2009-08-25 22 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