首页 > 设计 > WEB开发 > 正文

13.8.过滤和排序XMLListCollection

2023-07-22 12:39:11
字体:
来源:转载
供稿:网友
13.8.1. 问题
我想过滤和排序XMLListCollection.
13.8.2. 解决办法
使用XMLListCollection 继承的ListViewCollection 类的filterFunction 和sortFunction 属性或直接传递Sort 类型对象给XMLListCollection 的sort 属性。
13.8.3. 讨论
XMLListCollection 用于描述根节点下有多个节点的XML 数据。例如nutrition 节点下有food节点被翻译为XMLListCollection 后允许food 节点可被当作集合处理:
+展开
-XML
<nutrition>
<food>
<name>Avocado Dip</name>
<calories>110</calories>
<total-fat>11</total-fat>
<saturated-fat>3</saturated-fat>
<cholesterol>5</cholesterol>
<sodium>210</sodium>
<carb>2</carb>
<fiber>0</fiber>
<protein>1</protein>
</food>
</nutrition>

过滤XMLListCollection 的方法和ArrayCollection 一样:传递一个函数引用,该函数接受一个object,返回boolean 值,指示对象是否应该留在过滤视图中。例如:
+展开
-ActionScript
coll.filterFunction = lowCalFilter;
private function lowCalFilter(value:Object):Boolean {
if(Number(value.calories) < 200) {
return true;
}
return false;
}

排序XMLListCollection 需要一个Sort 对象,其fields 属性需要一个SortField 对象数组:
+展开
-ActionScript
var sort:Sort = new Sort();
sort.fields = [new SortField("calories"false,falsetrue)];
coll.sort = sort;
coll.refresh();

完整代码如下:
+展开
-XML
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxmlwidth="400"
height="300creationComplete="xmlService.send()">

<mx:HTTPService url="assets/data.xmlresultFormat="xml"
id="xmlServiceresult="createXMLCollection(event)"/>

<mx:Script>
<![CDATA[
import mx.collections.SortField;
import mx.collections.Sort;
import mx.rpc.events.ResultEvent;
import mx.collections.XMLListCollection;
[Bindable]
private var coll:XMLListCollection;
private function
createXMLCollection(event:ResultEvent):void {
var list:XMLList = new XMLList(event.result);
coll = new XMLListCollection(list.food);
var sort:Sort = new Sort();
sort.fields = [new SortField("calories"falsefalsetrue)];
coll.sort = sort;
coll.refresh();
}
private function applyFilter():void {
coll.filterFunction = lowCalFilter;
coll.refresh();
}
private function lowCalFilter(value:Object):Boolean {
if(Number(value.calories) < 200) {
return true;
}
return false;
}

]]>
</mx:Script>
<mx:DataGrid dataProvider="{coll}">
<mx:columns>
<mx:DataGridColumn dataField="calories"/>
<mx:DataGridColumn dataField="name"/>
</mx:columns>
</mx:DataGrid>
<mx:Button click="applyFilter()label="filter"/>
</mx:VBox>

你还可以使用E4X 语句执行复杂的过滤操作,例如使用@语法访问属性:
+展开
-ActionScript
private function lowFatFilter(value:Object):Boolean {
if(value.calories(@fat) < Number(value.calories)/5) {
return true;
}
return false;
}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表