0

現在、2つのArrayCollection(a、b)があり、aはバインド可能に設定されています。aをbでリセットしたい。

私たちのプロジェクトの古いコードは次のようなものです。

a = new ArrayCollection();
for (var i:int = 0; i < b.length; i++) {
    a.addItem(b.getItemAt(i));
}

次に、メモリリークが発生する可能性があると思います。だから私はそれを次のように変更しました:

a.removeAll();
for (var i:int = 0; i < b.length; i++) {
    a.addItem(b.getItemAt(i));
}

次に、トピックを読みました。フレックス最適化のヒント:ArrayCollection.removeAll()とArrayCollection.source = new Array()。これはバグですか? データセットが大きい場合、removeAll()によってパフォーマンスの問題が発生することが示されています。

それで、それはトリックオフがあることを意味しますか?データセットが小さい場合はremoveAllを使用する必要があり、データセットが大きい場合はremoveAll()を使用しないでください。

別の質問ですが、ArrayCollectionのソースの変更に関するトピックも読みました。a = bを直接使用すると、「ArrayCollectionインスタンスでイベントをリッスンしているすべてのデータバインドされたコントロールが強制終了されます」と表示されます。わかりません。a = bを試しましたが、問題なく動作します(データプロバイダーの更新としてaを使用するビュー)。

a=bとa.source=b.sourceを使用することの違いは何ですか?

Flexは初めてです。前もって感謝します。

4

2 に答える 2

1

私も試してみます:

a.removeAll();
a.addAll(b.list);

宣言する場合:

a = new ArrayCollection()

アプリケーションにバインドされている「古い」ArrayCollectionへのポインタを失います。そのため、「new ArrayCollection」を実行すると、バインディングが機能しなくなります。ただし、あなたの例では、「新しいArrayCollection」を作成していません...そのArrayCollectionのオブジェクトを別のものに置き換えているだけです...したがって、バインディングは引き続き機能します。

何千ものデータがある場合は、何らかのページネーションの実装を検討することをお勧めします。数百個程度であれば、a.removeAll(); のパフォーマンスについてあまり心配する必要はないと思います。

于 2012-11-14T18:21:54.437 に答える
1

ArrayCollectionはArrayのラッパー クラスであり、基になる Array は source プロパティを使用してアクセスできます

ArrayCollection クラスは、ICollectionView または IList インターフェイスのメソッドとプロパティを使用してアクセスおよび操作できるコレクションとして Array を公開するラッパー クラスです。ArrayCollection インスタンスに対する操作は、データ ソースを変更します。たとえば、ArrayCollection で removeItemAt() メソッドを使用すると、基になる配列から項目が削除されます。

  • したがって、ArrayCollection の Source プロパティを常に使用する必要があります
a = new ArrayCollection(b); or 

a= new ArrayCollection();// Default constructor ArrayCollection(source:Array=null);
a.source = b; //updates data in Arraycollection

データバインディングとは、データソースにコントロールをバインドすることを意味します(関数、オブジェクト、他のコントロール、配列、XML、コレクション、リストなどのようなものである可能性があります)

データバインディングは、あるオブジェクトのデータを別のオブジェクトに結び付けるプロセスです。アプリケーションの異なるレイヤー間でデータを渡す便利な方法を提供します。データ バインディングには、ソース プロパティ、宛先プロパティ、およびソースから宛先にデータをコピーするタイミングを示すトリガー イベントが必要です。ソース プロパティが変更されると、オブジェクトはトリガー イベントを送出します。

  • データバインディングは、複数の変更イベントを作成し、getter と setter の両方が変更時に実行されるため、大きなデータを扱うアプリケーションにとって有害で​​ある可能性があります。これには追加の処理が必要です
private function handler_B_DataChange(event:Event)
{
var a:Arraycollection = new ArrayCollection(b);
controlA.dataProvider = a;
//or just
controlB.dataProvider = new ArrayCollection(b);
}

バインディングの詳細は、関数、オブジェクト、および配列へのバインディングで表示できます

役立つことを願っています

于 2012-11-14T05:29:57.690 に答える