2011-08-03 10 views
2

arraycollectionから拡張されたオブジェクトがあります。このオブジェクトは、arraycollectionsソースオブジェクトにアクセスし操作する必要があります。この場合、データのローカルソート/フィルタコピーはソースデータと同期しなくなります。正しく整列させるには、ソート/フィルターを再適用する必要があります。イベントをディスパッチせずに配列コレクションにソート/フィルタを適用するFlex

これを通常行うには、arraycollectionでrefresh()を呼び出しますが、リフレッシュイベントもブロードキャストします。私が望むのは、イベントをディスパッチせずにソート/フィルタを更新することです。

ArrayCollectionクラスを調べると、ListCollectionViewから拡張されていることがわかります。リフレッシュ機能

public function refresh():Boolean 
{ 
    return internalRefresh(true); 
} 

がたListCollectionViewであり、それはうるさく

private function internalRefresh(dispatch:Boolean):Boolean 
{ 
    if (sort || filterFunction != null) 
    { 
     try 
     { 
      populateLocalIndex(); 
     } 
     catch(pending:ItemPendingError) 
     { 
      pending.addResponder(new ItemResponder(
       function(data:Object, token:Object = null):void 
       { 
        internalRefresh(dispatch); 
       }, 
       function(info:Object, token:Object = null):void 
       { 
        //no-op 
       })); 
      return false; 
     } 

     if (filterFunction != null) 
     { 
      var tmp:Array = []; 
      var len:int = localIndex.length; 
      for (var i:int = 0; i < len; i++) 
      { 
       var item:Object = localIndex[i]; 
       if (filterFunction(item)) 
       { 
        tmp.push(item); 
       } 
      } 
      localIndex = tmp; 
     } 
     if (sort) 
     { 
      sort.sort(localIndex); 
      dispatch = true; 
     } 
    } 
    else if (localIndex) 
    { 
     localIndex = null; 
    } 

    revision++; 
    pendingUpdates = null; 
    if (dispatch) 
    { 
     var refreshEvent:CollectionEvent = 
      new CollectionEvent(CollectionEvent.COLLECTION_CHANGE); 
     refreshEvent.kind = CollectionEventKind.REFRESH; 
     dispatchEvent(refreshEvent); 
    } 
    return true; 
} 

この関数を呼び出し、その関数はプライベートですので、使用できなくしてたListCollectionViewを拡張するクラスです。また、internalRefresh関数に含まれるものの多くはプライベートなものです。

ArrayCollectionを拡張するクラスからinternalRefreshを呼び出す方法を知っている人はいますか?または、リフレッシュが呼び出されたときにリフレッシュイベントがディスパッチされないようにする方法はありますか?

+0

なぜ、リフレッシュイベントがブロードキャストされるのを止めたいのですか? –

+0

間違ったタイミングで起こっているため、ArrayCollectionを表示しているすべての情報が、すべての情報を再描画/再読み込みされます。また、ArrayCollectionが正常に動作するようにもなっていません。リフレッシュイベントは、ソートまたはフィルタが変更された後にのみディスパッチされます。 – Zone12

答えて

2

マイ(読み:ハック):-)幸運:

addEventListener(CollectionEventKind.REFRESH, handlerHack, true); 

は誰の前に、このリスナーonCaptureを追加し、この解決策イベントに行動する。

ソート/フィルタを更新するためにcollection.refresh()を呼び出す前に、ブール値フラグをtrueに設定してください。リスナーで

discardRefreshEvent = true; 
myCol.refresh(); 

...

private function handlerHack(evt:CollectionEvent):void 
{ 
    if (discardRefreshEvent) 
     { 
      evt.stopImmediatePropagation(); 
      discardRefreshEvent = false; 
     } 
} 

免責事項:(他のイベントと同様の機能を実装している)、また、唯一のイベントタイプに推測/名前の前にこの正確な使用を行っていません。

+0

私はこれが私の機能要求を受け入れるようにadobeを得るまで私がそれをしなければならない方法だと思います。 – Zone12

+0

この方法を試してみると、より多くの機能がブロックされて正しく動作しなくなっているようです。私はコードに深く触れなければならないと思う。 – Zone12

+1

あなたがより具体的な懸案事項に終わった場合は、ここにコメントを残すか、新しい質問を開いて自由にお手伝いします。 –

0

ArrayCollectionを拡張し、リフレッシュイベントをリッスンし、起動時にstopImmediatePropagation()を呼び出すことができますか?私は...これでスタートする

関連する問題