Comment puis-je supprimer des éléments d'une collection avec la fonction de filtre, puis ajouter de nouveaux éléments qui ne répondent pas aux critères de filtre?

StackOverflow https://stackoverflow.com/questions/513498

Question

J'ai une collection, et je veux supprimer tous les éléments qui ont une propriété définie sur true. J'utilise un filterFunction pour y parvenir. Ma question est, comment puis-je ajouter de nouveaux éléments à la collection qui ont cette propriété est définie sur true? Le filterFunction est toujours appliquée, et l'élément n'a pas ajouté ....

Dois-je itérer la collection et supprimer des éléments un à la fois? Je pensais que c'est exactement ce refresh () fait.

Merci.

<?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>
Était-ce utile?

La solution

filterFunction ne supprime pas réellement les articles de la ArrayCollection. Il suffit de les cacher de la vue. Vous pouvez voir encore tous les éléments de propriété ArrayCollection.source.

Si vous ajoutez de nouveaux éléments en filterFunction est toujours appliquée, ils sont trop soumis à un filtrage.

Pour supprimer définitivement les éléments d'une liste, le convertir en un tableau et utiliser Array#filter.

var newCollection:ArrayCollection = 
    new ArrayCollection(oldCollection.toArray().filter(myFilterFunction))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top