4


0

DataProviderにデータを設定するために配列を使用しています。DataProviderはリストコンポーネントに設定するために使用しています。 このような:

var myDataProvider = new DataProvider(this.myArray); this ['list']。dataProvider = myDataProvider;

配列に変更が加えられたら、それらの変更がリストコンポーネントに反映されるようにDataProviderに更新するように指示します。 DataProviderに配列の変更を待ち受けて自分自身を更新するように指示する方法があればいいでしょうが、私は手動でそれを更新する方法を取り入れます。

DataProviderを新しいDataProviderに置き換えることはできますが、その場合、リストは選択を失います。 DataProviderを調べて、すべてのエントリを比較してそれを配列に一致させることができると思いますが、これはあまりにも面倒です。 配列に一致するように更新するようにDataProviderに指示する方法はありますか?

編集:私はFlexではなくFlashでこれを行う方法を探しています。

4 Answer


5


配列はAS 3ではバインドできません。それらはデータバインディングイベント自体をディスパッチ/トリガしません。

Flexを使っているのであれば、配列をbindableである ArrayCollection`でラップし、 Array`の代わりに `ArrayCollection`を操作すれば、すべて自動的に期待通りに動作するはずです。

だから、実際には:

var myAC:ArrayCollection = new ArrayCollection(myArray); var myDP = new DataProvider(myAC);

myAC [0] = '配列を変更します!'; // dataProviderに反映されます

さらに良いことに、その DataProvider`インスタンスをFlexコンポーネントに渡すのであれば、通常(ほとんど常に)代わりに ArrayCollection`を渡すことができます。 しかし、あなたは私がこれを確認するのに十分な文脈を示していません。

ここにいくつかの役に立つリンクがあります:

*編集:*私のせい、私は確かにあなたが上記のためにFlexを使っていたと仮定しました。

普通のAS3では、プリンシパルは同じです。 Array`はイベントを送出しませんが、http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3 / [ DataProvider`]は送出しません。 dataProvider自体に変更を加えることができれば、それでいいでしょう。

AS3の DataProvider`クラスは、例えば addItem`、 removeItem、` replaceItem`、 `replaceItemAt`のようなデータ操作のためのたくさんのメソッドを提供します。

したがって、基本的には、ソース配列にどのような変更を加える必要があるのか​​ということになります。 多くの場合、 `DataProvider`を介してそれらを実行できるでしょう。


1


データプロバイダと元の配列との関係を理解するために、ここ4時間を費やしました。 データグリッドでGetItemAtメソッドを使用すると、データグリッドのデータプロバイダが、GetItemAtメソッドを使用したときに自動的に更新されて作成される配列も更新されることがわかりました。

import fl.events.ListEvent; fl.data.DataProviderをインポートします。

var arr = new Array(); arr.push({Name: "Mike"、Height: "6'4"}); arr.push({Name: "Jackie"、Height: "5'9"}); arr.push({Name: "Mike"、Height: "0'10"});

dg.addColumn( "Name"); dg.addColumn( "Height"); dg.dataProvider = new DataProvider(arr); dg.addEventListener(ListEvent.ITEM_CLICK、updatename);

関数updatename(e):void {e.target.getItemAt(e.rowIndex)["Name"] = name_txt.text; trace(arr [e.rowIndex] ["Name"]); }

煩わしいのは、removeItemAtメソッドを使用することです。データグリッドから行が削除されますが、配列は更新されません。 このプロジェクトの開始時には、getItemAtが配列を更新するとは思っていませんでした。そのため、コードを2回減算する方法を4時間かけて調べました。


1


同じ行に沿って、もしあなたが配列を更新すれば、それは自動的にデータグリッドを更新するでしょう(少なくともFlash CS4で)。

import fl.events.ListEvent; fl.data.DataProviderをインポートします。

var arr = new Array(); arr.push({Name: "Mike"、Height: "6'4"}); arr.push({Name: "Jackie"、Height: "5'9"}); arr.push({Name: "Mike"、Height: "0'10"});

dg.addColumn( "Name"); dg.addColumn( "Height"); dg.dataProvider = new DataProvider(arr); dg.addEventListener(ListEvent.ITEM_CLICK、updatename);

関数updatename(e):void {arr [e.rowIndex] ["Name"] = "none"; }

ただし、arr.spliceを使用して配列内の行を削除して、自動的にデータグリッドを更新することはできません。 削除(スプライス)と追加(プッシュ)の場合は、配列とデータグリッドを別々に更新する必要があります。


0


データを変更してからデータプロバイダを再度割り当てることができます。

var myDataProvider = new DataProvider(this.myArray); this ['list']。dataProvider = myDataProvider;

myDataProvider.getItemAt(0)["名前"] = "何らかの変更"; this ['list']。dataProvider = myDataProvider;