Как удалить элементы из коллекции с функцией фильтра, а затем добавить новые элементы, которые не соответствуют критериям фильтра? - PullRequest
1 голос
/ 05 февраля 2009

У меня есть коллекция, и я хочу удалить все элементы, для которых определенное свойство имеет значение true. Я использую функцию filterFunction для достижения этой цели. Мой вопрос: как я могу добавить новые элементы в коллекцию, для которых это свойство имеет значение true? Функция filter все еще применяется, а элемент не добавляется ....

Должен ли я перебирать всю коллекцию и удалять элементы по одному? Я думал, что это именно то, что делает refresh ().

Спасибо.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
    <mx:Script>
        private function hideSpecialItems():void
        {
            items.filterFunction = 
                function (item:Object):Boolean
                {
                    return item.isSpecial;
                }

            items.refresh();

            trace(items.length.toString()); // 2
        }

        private function addSpecialItem():void
        {
            items.addItem({name: "new Special Item", isSpecial: true});

            trace(items.length.toString()); // Item is added - returns 3
        }

        private function addNormalItem():void
        {
            items.addItem({name: "new Item", isSpecial: false});

            trace(items.length.toString()); // Item not added - returns 2
        }
    </mx:Script>

    <mx:ApplicationControlBar>
        <mx:Button label="Hide Items That Aren't Special" click="hideSpecialItems();" />

        <mx:Button label="Add a Normal Item" click="addNormalItem();" />

        <mx:Button label="Add a Special Item" click="addSpecialItem();" />
    </mx:ApplicationControlBar>

    <mx:ArrayCollection id="items">
        <mx:Array>
            <mx:Object name="item 1" isSpecial="{false}" />
            <mx:Object name="item 2" isSpecial="{false}" />
            <mx:Object name="item 3" isSpecial="{false}" />
            <mx:Object name="item 4" isSpecial="{true}" />
            <mx:Object name="item 5" isSpecial="{true}" />
            <mx:Object name="item 6" isSpecial="{false}" />
        </mx:Array>
    </mx:ArrayCollection>

    <mx:DataGrid dataProvider="{items}" />
</mx:Application>

1 Ответ

3 голосов
/ 05 февраля 2009

filterFunction фактически не удаляет элементы из коллекции ArrayCollection. Это просто скрывает их от взгляда. Вы по-прежнему можете видеть все элементы в свойстве ArrayCollection.source.

Если вы добавляете новые элементы, когда функция filterFunction все еще применяется, они тоже подлежат фильтрации.

Чтобы окончательно удалить элементы из списка, преобразуйте его в массив и используйте Array#filter.

var newCollection:ArrayCollection = 
    new ArrayCollection(oldCollection.toArray().filter(myFilterFunction))
...