Apache flex 如何使用筛选功能从集合中删除项目,然后添加不带';是否不符合筛选标准?

Apache flex 如何使用筛选功能从集合中删除项目,然后添加不带';是否不符合筛选标准?,apache-flex,actionscript,collections,filtering,Apache Flex,Actionscript,Collections,Filtering,我有一个集合,我想删除将某个属性设置为true的所有项。我使用一个filterFunction来实现这一点。我的问题是,如何将该属性设置为true的新项添加到集合中?filterFunction仍然应用,并且未添加项 我是否必须遍历整个集合并一次删除一个项目?我认为这正是refresh()所做的 谢谢 <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/200

我有一个集合,我想删除将某个属性设置为true的所有项。我使用一个filterFunction来实现这一点。我的问题是,如何将该属性设置为true的新项添加到集合中?filterFunction仍然应用,并且未添加项

我是否必须遍历整个集合并一次删除一个项目?我认为这正是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>

私有函数hideSpecialItems():void
{
items.filterFunction=
函数(项:对象):布尔值
{
返回项目。是特殊的;
}
items.refresh();
跟踪(items.length.toString());//2
}
私有函数addSpecialItem():void
{
附加项({名称:“新的特殊项目”,isSpecial:true});
跟踪(items.length.toString());//添加了项-返回3
}
私有函数addNormalItem():void
{
items.addItem({名称:“新项目”,isSpecial:false});
跟踪(items.length.toString());//未添加项-返回2
}

filterFunction
实际上不会从ArrayCollection中删除项。它只是将它们从视图中隐藏。您仍然可以看到ArrayCollection.source属性中的所有项

如果在仍然应用filterFunction的情况下添加新项,则它们也会受到筛选的影响

要从列表中永久删除项目,请将其转换为数组并使用
Array\filter

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

嘿,谢谢你的回答。它工作得很好。虽然不是很优雅,但它的行数尽可能少,完全符合我的需要。