0

アクション スクリプトを使用して作成された凡例の更新に問題があります。

この問題を理解するには、次の手順をお読みください。

  1. 2 つのデータ系列を含む折れ線グラフを作成しました。
  2. 伝説を作った。
  3. コンテナーにグラフと凡例を追加しました。

  4. 更新ボタンがあります。ボタンをクリックしました。

  5. これで、折れ線グラフが 3 つのデータ シリーズで更新されました。
  6. 凡例を更新しようとしたとき、まだ 3 つではなく 2 つのラベルで初期値を指していました。

  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

これは 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 に答える
0

約 1 年前、私は Flex チャートを使用していくつかの重い作業を行いましたが、常にフラストレーションの原因になる可能性があります。事実、彼らは内部で非常に賢いため、行動について推論するのが非常に困難です.

私が気づいたことの 1 つは、データを変更するときに、実際には階層を少しずつ移動するのに数フレームかかる場合があることです。つまりdataProvider、シリーズ情報を更新するときと同じフレームで凡例を更新しても、数フレームで変更されるため、正しいバージョンのインスタンスにバインドされない可能性があります。(つまり、 への変更Seriesは非同期で、 への変更dataProviderは同期です)。

これがあなたの問題であるかどうかを確認する簡単なテストの 1 つは、ハック タイマーを配置することです。100 ミリ秒程度設定してから、後で設定します。できれば、変更が必要なプロパティに反映されていることdataProviderを願っています。Seriesもう 1 つのアイデアは、2 番目のボタンを使用し、新しいボタンを視覚的に確認したら、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

obja にキャストされることが確実な場合は最初が最適でBarあり、そうでない場合は例外がスローされます (実際、 a にキャストされなかった場合はエラーになりますBar)。2 番目の ( as) は、妥当な可能性objがありBar、エラーがスローされず、代わりに が返される場合に使用されnullます。

この動作のため、可能な限り最初のフォームを使用することをお勧めします。

于 2009-08-26T01:31:46.420 に答える