集合是ActionScript 中功能强大的基于索引的数组组件,添加了如对内容进行排序等功能,
操作数组的读取位置,创建经过排序的数组视图。集合也能通知其任意事件监听器监听其数
据是否改变,以及任何数据项被添加到源数组时可执行自定义逻辑。当数据改变时可通知其
监听器,这是集合的新功能,叫数据绑定,还有就是允许DataGrid 和List 组件对其内容进
行排序和过滤。集合是使用数据驱动控件以及从数据库返回的服务器端服务的重要内容。
经常被使用的两个集合类型是ArrayCollection 类XMLListCollection 类。ArrayCollection 是
Array 的包装类,提供更方便的如添加和移除数据项以及能够创建游标启用要轻松地存储数
组中的最后读取的位置等方法。而XMLListCollection 是XML 对象的包装类,提供的功能
有:根据索引访问数据,添加新对象以及游标等方法。XMLListCollection 对于处理XML 对
象以及经常需要解析XML 为数组时特别有用。
使用addItemAt 或addItem 方法插入对象到ArrayCollection ,
getItemIndex 或contains 方法用于检测数据项是否已存在于数组中,而ArrayCollection 的sort
属性是对ArrayCollection 排序以及通过某个字段决定接收第一个或最后一个数据。
<mx:Script> <![CDATA[ import mx.collections.SortField; import mx.collections.Sort; import mx.collections.ArrayCollection; private var coll:ArrayCollection; private function init():void { coll = new ArrayCollection( [{name:"Martin Foo", age:25}, {name:"Joe Bar", age:15}, {name:"John Baz", age:23}]); } 要插入元素到指定位置,可使用addItemAt 方法: private function addItem():void { coll.addItemAt({name:"James Fez", age:40}, 0); } ]]> </mx:Script>
Sort 对象提供findItem 方法用于搜索这个ArrayCollection 中的所有元素。方法原型如下:
public function findItem(items:Array, values:Object, mode:String,
returnInsertionIndex:Boolean = false, compareFunction:Function = null):int
Value 参数可以是包含属性和所需值的任何对象。Mode 字符串可以是
Sort.ANY_INDEX_MODE,表示返回任何匹配项索引,Sort.FIRST_INDEX_MODE 表示返
回第一个匹配项索引, Sort.LAST_INDEX_MODE 表示返回最后一个匹配项索引。
returnInsertionIndex 参数表示如果该方法找不到由values 参数标识的项目,并且此参数为
true,则findItem() 方法将返回这些值的插入点,也就是排序顺序中应插入此项目的。
compareFunction 设置用于查找该项目的比较运算符函数.
使用Sort 对象的findItem 方法代替上面的方法:
private function checkExistence():int { var sort:Sort = new Sort(); return sort.findItem(coll.source, {name:nameTI.text, age:Number(ageTI.text)}, Sort.ANY_INDEX_MODE); }
首先要创建一个Sort,传递一个SortField 对象数组给fields 属性。这些SortField 对象包含
的字符串正是每个ArrayCollection 元素将要用来排序的属性。如要对每个对象的age 属性进
行排序,创建Sort 对象,传递SortField,设置排序字段为age:
private function getOldest():void { var sort:Sort = new Sort(); sort.fields = [new SortField("age", false)]; coll.sort = sort; coll.refresh(); trace(coll.getItemAt(0).age+" "+coll.getItemAt(0).name); }
过滤ArrayCollection
对ArrayCollection 数据进行过滤,设置过滤器移除些不匹配的结果。
将原型为function(item:Object):Boolean 的函数传递给ArrayCollection 的filter 属性。如果返
回true 表示值继续留在ArrayCollection,返回false 表示其值被移除。
filterFunction 属性是由ListCollectionView 类定义,它是ArrayCollection 的父类。当过滤器
函数被传递给继承自ListCollectionView 的任何子类后,这里为ArrayCollection 对象,应用
过滤器后必须调用refresh 方法:
import mx.collections.ArrayCollection; private var coll:ArrayCollection; private function init():void { coll = new ArrayCollection([ {name:"Martin Foo", age:25}, {name:"Joe Bar", age:15}, {name:"John Baz", age:23}, {name:"Matt Baz", age:21}]); coll.filterFunction = filterFunc; coll.refresh(); for(var i:int = 0; i<coll.length; i++) { trace(coll.getItemAt(i).name); } } private function filterFunc(value:Object):Object { if(Number(value.age) > 21) { return true; }rreturn false; }