Почему установщик поставщика данных не вызывается после фильтрации массива с использованием функции фильтра - PullRequest
1 голос
/ 10 июня 2011

Я использую это:

private var _hrInfoView:ArrayCollection;
 [Bindable]
 public function get HRInfoView():ArrayCollection
  {
   return _hrInfoView;
   }
  public function set HRInfoView(value:ArrayCollection):void
  {
   _hrInfoView = value;
  }

 private function onFilterByContent(event:ContextMenuEvent):void
 {              
    HRInfoView.filterFunction = processFilter;  
    HRInfoView.refresh();
  //Break point here shows HRInfoView as different what is in line above. Why is setter not called?
}

Когда я ставлю точку останова на установщик HRInfoView, он никогда не срабатывает (когда я ясно вижу в выражении наблюдения, что HRInfoView изменился до и после фильтрации)! Зачем? Спасибо.

Ответы [ 3 ]

1 голос
/ 10 июня 2011

иди сюда и читай источник

[ПРАВИТЬ]

<mx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;

        [Bindable]
        public var myAC:ArrayCollection = new ArrayCollection([{label:"One"}, {label:"Two"}, {label:"Three"}, {label:"Four"}]);

        [Bindable]
        public var myAC2:ArrayCollection = new ArrayCollection();

        public function removeFilter(e:Event):void{
            trace(this.myAC.source.length )
            this.myAC.filterFunction = null;
            this.myAC.refresh()
            trace(this.myAC.source.length )
        }
        public function addFilter(e:Event):void{
            trace(this.myAC.source.length )
            this.myAC.filterFunction = filterFunc;
            this.myAC.refresh()
            trace(this.myAC.source.length )
        }
        public function filterFunc( item:Object ):Boolean{
            if( item.label == "One" )
                return true;

            if( item.label == "Two" )
                return true;

            return false;
        }
        public function copyData(e:Event):void{
            myAC2 =   new ArrayCollection( myAC.toArray() );  
            myAC2.refresh()
        }
    ]]> 
</mx:Script>
<mx:Label text="original data with filter option"  y="0"/>
<mx:DataGrid y="26" id="nameGrid" dataProvider="{myAC}" width="200" height="200"/>
<mx:Button id="button2" label="Add Filter" click="addFilter(event)" x="0" y="234"/>
<mx:Button id="button3" y="264" label="Remove Filter" click="removeFilter(event)"/>


<mx:Button id="button4" x="289" y="234" label="copy filtered data" click="copyData(event)"/>
<mx:Label text="Copied filtered data"  x="300" y="0"/>
<mx:DataGrid  y="26" x="287" id="nameGrid2" dataProvider="{myAC2}" width="200" height="200"/>
1 голос
/ 27 июня 2012

Он не вызывает сеттер, потому что вы не устанавливаете это свойство.То, что вы делаете, - это вызываете метод получения, чтобы вы могли получить свойство от него, чтобы установить это.И HRInfoView.filterFunction, и HRInfoView.refresh() вызывают геттер для получения _hrInfoView, а затем вызывают функции или свойства из этого.

1 голос
/ 10 июня 2011

РЕДАКТИРОВАТЬ: После прочтения вопроса, я думаю, я вижу вашу проблему.

Когда вы применяете функцию фильтра к ArrayCollection, вы фактически не влияете на ArrayCollection.Flex создает копию ArrayCollection и помещает ее в «оболочку» и включает в себя только те записи, которые соответствуют вашему фильтру.Вот почему ваш сеттер никогда не вызывается.

Если вы вызовете ArrayCollection.length в отфильтрованной коллекции, он покажет количество отфильтрованных записей вместо общего количества записей, с которых вы начали.Если вы удалите функцию фильтра и вызовете метод refresh (), эта коллекция «обертки» будет удалена.

Вам не нужно делать ничего особенного, чтобы получить эту «обертку» копию ArrayCollection.Flex автоматически возвращает отфильтрованную / упаковочную копию коллекции всякий раз, когда вы используете исходную коллекцию ArrayCollection.

Эта ссылка содержит дополнительную информацию.

...