1

1台のPCに、MySQLDBから取得したレコードのコレクションによってデータが入力されたarraycollectionであるdataproviderを備えたデータグリッドがあります。別のPCでは、別のコンポーネントが同じレコードのコレクションを取得して更新します。瞬時に、PC1のデータグリッドはPC2で行われた変更を反映しました。これは、影響を受けるすべてのコントロールに変更をオンラインでプッシュするため、便利です。ただし、他のことを行うためにarraycollectionの変更を検出したいのですが、そのようなCollectionEvent.COLLECTION_CHANGEは検出されません。手伝ってもらえますか?コードは次のとおりです。

protected function doInit():void
{
acLeave.addEventListener(CollectionEvent.COLLECTION_CHANGE, onAcLeaveChange);
}

protected function onAcLeaveChange(event:CollectionEvent):void
{
do something
}

私はlcdsを使用しており、データ管理サービスはすでにデータ同期を処理しています。これが、データグリッドデータプロバイダーacLeaveを備えた最初のPCが自動的に変更された理由です。どういうわけか、lcdsはクライアント(pc one)がオンラインにあることを知っているため、変更をプッシュします。私の質問は、データグリッドデータが変更されたことです。他の更新を実行できるように、データ変更が発生したことを検出したいと思います。通常、datagridの変更を検出するには、datagrid datachangeを使用するか、collectionEvent.COLLECTION_CHANGEのデータプロバイダーにリスナーを追加するだけですが、この場合、ac acLeaveが変更されたことがわかりますが、イベントは発生しませんでした。助けてください!

こんにちは、また私とあなたのアドバイスに感謝します。セッターをacLeaveに追加しましたが、collectionEventの変更をリッスンできません。変更されたコードは次のとおりです。

private var _acLeave:ArrayCollection = new ArrayCollection();

[Bindable]
public function get acLeave():ArrayCollection
{
    return _acLeave;
}
public function set acLeave(value:ArrayCollection):void
{
    _acLeave = value;
}
protected function doInit():void
{
    acLeave.addEventListener(CollectionEvent.COLLECTION_CHANGE, onAcChange);
}

protected function dataGrid_creationCompleteHandler(event:FlexEvent):void
{
    getAllResult.token = leaverequestService.getAll();
    getAllResult.addEventListener(ResultEvent.RESULT, onGotResult);
}

protected function onGotResult(event:ResultEvent):void
{
    acLeave = getAllResult.lastResult;
}

protected function onAcChange(event:CollectionEvent):void
{
    // this never executed because unable to detect a change on acLeave
    Alert.show("acLeave Changed !");
}
4

1 に答える 1

0

コレクション変更ハンドラーが起動していない場合は、次のようなことが起こっていると思います。

  • pc1はコレクション変更リスナーを追加します
  • pc2はコレクションを変更します
  • LCDSは、pc1にArrayCollection(変更された要素だけでなく)使用する新しいオブジェクトを送信します

collectionChangeをリッスンしているオリジナルArrayCollectionは、必ずしも変更されているわけではなく、置き換えられています。したがって、コレクション変更イベントは発生しません。

これにセッターメソッドを追加するとArrayCollection(このacLeave例では)、これが発生するかどうかがわかります。技術的には、コレクション変更イベントとこのセッターの両方を使用して、配列が変更される可能性があるすべてのケースを検出できるようにする必要があります。

于 2012-08-13T21:36:26.497 に答える