我正在使用它:
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在过滤之前和之后已经改变了)!为什么? 感谢。
答案 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.filterFunction
和HRInfoView.refresh()
都调用getter来获取_hrInfoView
,然后从中调用函数或属性。