2009-02-04 2 views
1

У меня есть коллекция, и я хочу удалить все элементы, которые имеют определенное свойство, равное 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> 

ответ

3

filterFunction не удаляет элементы из ArrayCollection. Это просто скрывает их от взгляда. Вы все еще можете увидеть все элементы в свойстве ArrayCollection.source.

Если вы добавляете новые элементы, в то время как filterFunction все еще применяется, они также могут фильтроваться.

Чтобы окончательно удалить элементы из списка, преобразуйте их в массив и используйте Array#filter.

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

Эй, спасибо за этот ответ. Он работает отлично. Не очень элегантный, но он делает именно то, что мне нужно, как можно меньше строк. –