为什么在使用filter函数过滤arraycollection后未调用dataprovider的setter

时间:2011-06-10 00:48:28

标签: flex actionscript-3 flex3

我正在使用它:

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的setter上放置断点时,它永远不会被击中(当我可以在监视表达式中清楚地看到HRInfoView在过滤之前和之后已经改变了)!为什么? 感谢。

3 个答案:

答案 0 :(得分:1)

编辑:再次阅读问题后,我认为我发现了您的问题。

将过滤器函数应用于ArrayCollection时,实际上并未影响ArrayCollection。 Flex会创建ArrayCollection的副本并将其放在“包装器”中,并且只包含与您的过滤器匹配的记录。这就是你永远不会调用你的二传手的原因。

如果在过滤的集合上调用ArrayCollection.length,它将显示已过滤的记录的数量,而不是您开始使用的记录总数。如果删除过滤器函数并调用refresh()方法,则会删除该“包装器”集合。

您无需执行任何特殊操作即可获取ArrayCollection的“包装”副本。每当使用原始ArrayCollection时,Flex都会自动返回集合的过滤/包装副本。

This link有一些额外的信息。

答案 1 :(得分:1)

go here并阅读来源

[编辑]

<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"/>

答案 2 :(得分:1)

它没有调用setter,因为你没有设置该属性。你正在做的是调用getter,以便你可以从中获取属性来设置它。 HRInfoView.filterFunctionHRInfoView.refresh()都调用getter来获取_hrInfoView,然后从中调用函数或属性。