我有一个从arraycollection扩展的对象。该对象必须访问和操作arraycollections源对象。发生这种情况时,数据的本地排序/过滤副本与源数据不同步。要正确排序,需要重新应用排序/过滤器。
为了正常执行此操作,您可以在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 :(得分:2)
我的(阅读:黑客)解决方案:
addEventListener(CollectionEventKind.REFRESH, handlerHack, true);
true 会在其他任何人对该事件采取行动之前将此侦听器添加到theCapture。
在调用collection.refresh()来更新排序/过滤器之前,请将布尔标志设置为true。
discardRefreshEvent = true;
myCol.refresh();
在听众中......
private function handlerHack(evt:CollectionEvent):void
{
if (discardRefreshEvent)
{
evt.stopImmediatePropagation();
discardRefreshEvent = false;
}
}
免责声明:之前没有完全使用过(已经与其他事件实现了类似的功能),也只是猜测事件类型/名称。
答案 1 :(得分:0)
也许你可以扩展ArrayCollection,监听刷新事件并在它被触发时调用它的stopImmediatePropagation()?我会从这开始......
祝你好运: - )