Как я могу удалить элементы из коллекции с помощью функции filter, а затем добавить новые элементы, которые не соответствуют критериям фильтрации?
-
21-08-2019 - |
Вопрос
У меня есть коллекция, и я хочу удалить все элементы, для определенного свойства которых установлено значение 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>
Решение
filterFunction
фактически не удаляет элементы из ArrayCollection.Это просто скрывает их от посторонних глаз.Вы по-прежнему можете видеть все элементы в свойстве ArrayCollection.source.
Если вы добавляете новые элементы, пока функция filterFunction все еще применяется, они тоже подлежат фильтрации.
Чтобы окончательно удалить элементы из списка, преобразуйте его в массив и используйте Array#filter
.
var newCollection:ArrayCollection =
new ArrayCollection(oldCollection.toArray().filter(myFilterFunction))