Flex применяет сортировку / фильтр к коллекции массивов без события отправки - PullRequest
2 голосов
/ 03 августа 2011

У меня есть объект, который расширен из коллекции массивов.Этот объект должен обращаться к исходному объекту arraycollections и манипулировать им.Когда это происходит, локальная отсортированная / фильтрованная копия данных не синхронизируется с исходными данными.Для правильного выравнивания сортировка / фильтр должны быть повторно применены.

Чтобы сделать это нормально, вы бы вызвали refresh () для 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, также является приватным.

Кто-нибудь знает способ вызова internalRefresh из класса, расширяющего ArrayCollection?Или способ предотвратить отправку события обновления при вызове обновления?

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

Мое (читай: взломать) решение этой проблемы:

addEventListener(CollectionEventKind.REFRESH, handlerHack, true);

true добавляет этот прослушиватель onCapture, прежде чем кто-либо еще сможет воздействовать на событие.

Перед вызовом collection.refresh () для обновления сортировки / фильтрации установите логический флаг в значение true.

discardRefreshEvent = true;
myCol.refresh();

В слушателе ...

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

Отказ от ответственности: раньше такого точного использования не применялось (реализовал аналогичную функциональность с другими событиями), также предполагая только типы / имена событий.

0 голосов
/ 03 августа 2011

может быть, вы могли бы расширить ArrayCollection, прослушать событие обновления и вызвать stopImmediatePropagation () для него при его запуске?Я бы начал с этого ...

Удачи: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...