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を呼び出す方法を知っている人はいますか?または、リフレッシュが呼び出されたときにリフレッシュイベントがディスパッチされないようにする方法はありますか?
なぜ、リフレッシュイベントがブロードキャストされるのを止めたいのですか? –
間違ったタイミングで起こっているため、ArrayCollectionを表示しているすべての情報が、すべての情報を再描画/再読み込みされます。また、ArrayCollectionが正常に動作するようにもなっていません。リフレッシュイベントは、ソートまたはフィルタが変更された後にのみディスパッチされます。 – Zone12