Wie kann ich Elemente aus einer Sammlung mit Filterfunktion, entfernen und dann neue Elemente hinzuzufügen, die die Filterkriterien nicht erfüllen?

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

Frage

Ich habe eine Sammlung, und ich möchte alle Elemente entfernen, die eine bestimmte Eigenschaft auf true gesetzt haben. Ich benutze einen filter dies zu erreichen. Meine Frage ist, wie kann ich neue Elemente in die Sammlung hinzufügen, haben diese Eigenschaft auf true gesetzt? Die filter werden noch angewandt, und das Element wird nicht hinzugefügt ....

Muß ich durch die gesamte Kollektion iterieren und Gegenstände einen nach dem anderen entfernen? Ich dachte, dass das ist genau das, was refresh () der Fall ist.

Danke.

<?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>
War es hilfreich?

Lösung

filterFunction nicht wirklich die Elemente aus der Arraycollection entfernen. Er versteckt sie nur aus der Ansicht. Sie können immer noch alle Elemente in ArrayCollection.source Eigenschaft.

Wenn Sie neue Elemente hinzufügen, während noch filter angewendet wird, sind sie zu unterliegen Filterung.

Um dauerhaft Elemente aus einer Liste zu entfernen, wandelt es in ein Array und Verwendung Array#filter.

var newCollection:ArrayCollection = 
    new ArrayCollection(oldCollection.toArray().filter(myFilterFunction))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top