2

我有一个从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 的方法?或者在调用刷新时停止发送刷新事件的方法?

4

2 回答 2

2

我的(阅读:hack)解决方案:

addEventListener(CollectionEventKind.REFRESH, handlerHack, true);

true在其他人对事件采取行动之前将此侦听器添加到捕获中。

在调用 collection.refresh() 以更新排序/过滤器之前,请将布尔标志设置为 true。

discardRefreshEvent = true;
myCol.refresh();

在听者...

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

免责声明:之前没有做过这种确切的使用(已经实现了与其他事件类似的功能),也只是猜测事件类型/名称。

于 2011-08-03T15:03:36.083 回答
0

也许你可以扩展 ArrayCollection,监听刷新事件并在它被触发时调用 stopImmediatePropagation() ?我会从这个开始...

祝你好运 :-)

于 2011-08-03T14:56:25.373 回答