【问题标题】:How can I remove items from a Collection with filter function, and then add new items that don't meet the filter criteria?如何从具有过滤功能的集合中删除项目,然后添加不符合过滤条件的新项目?
【发布时间】:2010-10-05 12:54:08
【问题描述】:

我有一个集合,我想删除所有将某个属性设置为 true 的项目。我使用 filterFunction 来完成此操作。我的问题是,如何将新项目添加到该属性设置为 true 的集合中? filterFunction 依然应用,item 没有添加....

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

【问题讨论】:

    标签: apache-flex actionscript collections filtering


    【解决方案1】:

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

    如果您在仍然应用 filterFunction 的情况下添加新项目,它们也会受到过滤。

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

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

    【讨论】:

    • 您好,感谢您的回答。它完美地工作。不是很优雅,但它在尽可能少的行中完全满足了我的需求。
    猜你喜欢
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 2018-07-01
    • 2012-03-16
    • 1970-01-01
    • 2010-12-09
    相关资源
    最近更新 更多