包 | spark.collections |
类 | public class Sort |
继承 | Sort AdvancedStyleClient EventDispatcher Object |
实现 | ISort |
语言版本: | ActionScript 3.0 |
产品版本: | Flex 4.5 |
运行时版本: | Flash Player 10.1, AIR 2.5 |
ICollectionView
接口或实现此接口的类)。将 Sort
实例分配给视图的 sort
属性后,必须调用该视图的 refresh()
方法才能应用此排序条件。
通常,这种排序是针对包含复杂项目的集合定义的,这样的集合是指那些对其中的对象的一个或多个属性执行排序的集合。以下示例显示了这种用法:
var col:ICollectionView = new ArrayCollection();
// In the real world, the collection would have more than one item.
col.addItem({first:"Anders", last:"Dickerson"});
// Create the Sort instance.
var sort:ISort = new Sort();
// Set the sort field; sort on the last name first, first name second.
var sortfieldLastName:ISortField = new SortField("last",true);
var sortfieldFirstName:ISortField = new SortField("first",true);
// Set the locale style to "en-US" to cause the strings
// to be ordered according to the rules for English as used in the USA.
sortfieldLastName.setStyle("locale","en-US");
sortfieldFirstName.setStyle("locale","en-US");
sort.fields = [sortfieldLastName, sortfieldFirstName];
// Assign the Sort object to the view.
col.sort = sort;
// Apply the sort to the collection.
col.refresh();
也有集合中包含简单项目(如 String
、Date
和 Boolean
等)的情形。在这种情况下,可直接对简单类型应用排序。在构造简单项目的排序时,请使用一个排序字段,并在 SortField 对象构造函数中指定 null
name
(第一个)参数。例如:
import mx.collections.ArrayCollection;
import spark.collections.Sort;
import spark.collections.SortField;
var col:ICollectionView = new ArrayCollection();
col.addItem("California");
col.addItem("Arizona");
var sort:Sort = new Sort();
// There is only one sort field, so use a null
// first parameter.
var sortfield:SortField = new SortField("null",true);
// Set the locale style to "en-US" to set the language for the sort.
sortfield.setStyle("locale","en-US");
sort.fields = [sortfield];
col.sort = sort;
col.refresh();
ICollectionView
接口的 Flex 实现将先检索远程位置的所有项目,然后再执行排序。如果要对排序后的列表使用分页,请在检索数据之前对远程集合应用排序。
由 SortField
类提供的默认比较可以将字符串按照特定语言进行正确排序。可以按照以下方式之一,设置类的实例的区域设置样式以选择语言:
- 在 MXML 声明中使用该类,并从包含声明的文档中继承区域设置。 示例:
<fx:Declarations> <s:SortField id="sf" /> </fx:Declarations>
<fx:Declarations> <s:SortField id="sf_SimplifiedChinese" locale="zh-Hans-CN" /> </fx:Declarations>
setStyle
方法,如 sf.setStyle("locale", "zh-Hans-CN")
addStyleClient()
方法来继承 UIComponent
的样式。
The <s:Sort>
tag has the following attributes:
<s:Sort Properties compareFunction="Internal compare function" fields="null" unique="false | true" />
In case items have inconsistent data types or items have complex data types, use of default built-in compare functions is not desired. Inconsistent sort result may occur in such cases. To avoid such problem, provide custom compare function and/or make item types consistent.
默认 MXML 属性fields
相关 API 元素
属性 | 由以下参数定义 | ||
---|---|---|---|
className : String [只读]
组件类的名称。 | AdvancedStyleClient | ||
compareFunction : Function
用于在排序时比较项目的方法。 | Sort | ||
constructor : Object
对类对象或给定对象实例的构造函数的引用。 | Object | ||
fields : Array
指定要比较的字段的 ISortField 对象 Array。 | Sort | ||
id : String
组件的标识。 | AdvancedStyleClient | ||
inheritingStyles : Object
包含该非可视样式客户端实例的可继承样式的对象。 | AdvancedStyleClient | ||
moduleFactory : IFlexModuleFactory
模块工厂作为用于查找样式管理器(控制此非可视样式客户端实例的样式)的上下文使用。 | AdvancedStyleClient | ||
nonInheritingStyles : Object
此组件的非继承样式链的开头内容。 | AdvancedStyleClient | ||
styleDeclaration : CSSStyleDeclaration
具有此对象声明的内嵌样式的样式声明。 | AdvancedStyleClient | ||
styleManager : IStyleManager2 [只读]
返回此组件使用的 StyleManager 实例。 | AdvancedStyleClient | ||
styleName : Object
该对象的样式值的源。 | AdvancedStyleClient | ||
styleParent : IAdvancedStyleClient
组件的父项用于评估后代选择器。 | AdvancedStyleClient | ||
unique : Boolean
指示排序是否应是唯一的。 | Sort |
方法 | 由以下参数定义 | ||
---|---|---|---|
Sort()
构造函数。 | Sort | ||
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
使用 EventDispatcher 对象注册事件侦听器对象,以使侦听器能够接收事件通知。 | EventDispatcher | ||
删除此组件实例的样式属性。 | AdvancedStyleClient | ||
将事件调度到事件流中。 | EventDispatcher | ||
findItem(items:Array, values:Object, mode:String, returnInsertionIndex:Boolean = false, compareFunction:Function = null):int
查找指定的数组内的指定对象(或插入点 — 如有要求)。如果找到,则返回其索引;如果未找到,则返回 -1。 | Sort | ||
为应用于该组件的类型选择器返回 CSSStyleDeclaration 对象数组,如果不存在则返回 null。 | AdvancedStyleClient | ||
获取已在此组件的样式查找链中的某个位置设置过的样式属性。 | AdvancedStyleClient | ||
如果 currentCSSState 不为 null,则返回 true。 | AdvancedStyleClient | ||
检查 EventDispatcher 对象是否为特定事件类型注册了任何侦听器。 | EventDispatcher | ||
表示对象是否已经定义了指定的属性。 | Object | ||
该类或扩展该类的类在 MXML 声明中使用时,调用 initialized 方法。 | AdvancedStyleClient | ||
表示 Object 类的实例是否在指定为参数的对象的原型链中。 | Object | ||
如果 cssState 与 currentCSSState 匹配,则返回 true。 | AdvancedStyleClient | ||
确定此实例与给定类型相同,还是属于给定类型的子类。 | AdvancedStyleClient | ||
将样式更改传播到此样式客户端实例的子项。 | AdvancedStyleClient | ||
返回表明指定的属性是否用于控制排序的布尔值。 | Sort | ||
表示指定的属性是否存在、是否可枚举。 | Object | ||
设置内部样式缓存值,以便 getStyle() 方法可以起作用。 | AdvancedStyleClient | ||
将 EffectManager 注册为每个效果事件的事件侦听器之一。 | AdvancedStyleClient | ||
从 EventDispatcher 对象中删除侦听器。 | EventDispatcher | ||
检查 fields 数组,对数组中每个 ISortField 对象调用 reverse()。 | Sort | ||
设置循环操作动态属性的可用性。 | Object | ||
对此组件实例设置样式属性。 | AdvancedStyleClient | ||
对指定的数组(不是副本)应用当前排序。 | Sort | ||
检测对样式属性的更改。 | AdvancedStyleClient | ||
首次初始化组件样式时,Flex 会调用 stylesInitialized() 方法。 | AdvancedStyleClient | ||
返回此对象的字符串表示形式,其格式设置遵守区域设置特定的约定。 | Object | ||
返回指定对象的字符串表示形式。 | Object | ||
返回指定对象的原始值。 | Object | ||
检查是否用此 EventDispatcher 对象或其任何祖代为指定事件类型注册了事件侦听器。 | EventDispatcher |
样式为常见样式,或与特定主题关联。如果为常见样式,则可以用于任何主题。如果样式与特定主题关联,则只有应用程序使用该主题时才能使用该样式。
样式 | 说明 | 由以下参数定义 | ||
---|---|---|---|---|
locale | 类型: String CSS 继承: 是 语言版本: ActionScript 3.0 产品版本: Flex 4.5 运行时版本: Flash10.1, AIR 2.5 区域设置标识符,用于指定语言、区域、脚本,还可以指定其它相关的标签和键。此标识符的语法必须遵守 Unicode 技术标准 #35 定义的语法(如 en-US、de-DE、zh-Hans-CN)。 对于基于浏览器的应用程序,默认区域设置基于浏览器的语言设置。(请注意,这不是在 Javascript 中可用的浏览器 UI 语言,而是用户已在浏览器首选参数中设置的 Web 页面首选区域设置的列表。)对于 AIR 应用程序,默认 UI 区域设置基于用户的系统首选参数。 了解详细信息 | Sort |
常量 | 由以下参数定义 | ||
---|---|---|---|
ANY_INDEX_MODE : String = "any" [静态]
执行查找时返回任何匹配项的索引。 | Sort | ||
FIRST_INDEX_MODE : String = "first" [静态]
执行查找时返回第一个匹配项的索引。 | Sort | ||
LAST_INDEX_MODE : String = "last" [静态]
执行查找时返回最后一个匹配项的索引。 | Sort |
compareFunction | 属性 |
compareFunction:Function
语言版本: | ActionScript 3.0 |
产品版本: | Flex 4.5 |
运行时版本: | Flash Player 10.1, AIR 1.5 |
用于在排序时比较项目的方法。如果指定了此属性,Flex 会忽略在此类中使用的 ISortField
对象中指定的所有 compareFunction
属性。
该比较函数必须具有以下签名:
function [name](a:Object, b:Object, fields:Array = null):int
此函数必须返回以下值:
- -1,如果在已排序序列中
Object a
应显示在Object b
之前。 - 0,如果
Object a
等于Object b
。 - 1,如果在已排序序列中
Object a
应显示在Object b
之后。
要返回到内部比较函数,请将此值设置为 null
。
fields
数组会指定要比较的对象字段。通常,算法将一直比较属性,直到用尽字段列表或能返回非零值。例如:
function myCompare(a:Object, b:Object, fields:Array = null):int
{
var result:int = 0;
var i:int = 0;
var propList:Array = fields ? fields : internalPropList;
var len:int = propList.length;
var propName:String;
while (result == 0 && (i < len))
{
propName = propList[i];
result = compareValues(a[propName], b[propName]);
i++;
}
return result;
}
function compareValues(a:Object, b:Object):int
{
if (a == null && b == null)
return 0;
if (a == null)
return 1;
if (b == null)
return -1;
if (a < b)
return -1;
if (a > b)
return 1;
return 0;
}
默认值为可以按升序或降序执行字符串、数字或日期比较的内部比较函数。仅在需要自定义比较算法时指定您自己的函数。这种情况通常仅当在显示中使用计算的字段时出现。
或者,您可以通过使用 ISortField
类的 compareFunction
属性分别为每个排序字段指定比较函数;这样,您可以对一些字段使用默认比较,而对其它字段使用自定义比较。
实现
public function get compareFunction():Function
public function set compareFunction(value:Function):void
fields | 属性 |
fields:Array
语言版本: | ActionScript 3.0 |
产品版本: | Flex 4.5 |
运行时版本: | Flash Player 10.1, AIR 2.5 |
指定要比较的字段的 ISortField
对象的 Array
。在进行排序时,数组中 ISortField 对象的顺序确定字段的优先级顺序。默认排序比较运算符会一直检查数组顺序中的排序字段,直到确定了两个要比较的字段的排序顺序。
默认值为 null。
此属性可用作数据绑定的源。修改此属性后,将调度 fieldsChanged
事件。
实现
public function get fields():Array
public function set fields(value:Array):void
相关 API 元素
unique | 属性 |
unique:Boolean
语言版本: | ActionScript 3.0 |
产品版本: | Flex 4.5 |
运行时版本: | Flash Player 10.1, AIR 1.5 |
指示排序是否应是唯一的。如果字段属性中列出的字段指定的任何值或组合值导致不确定或非唯一的排序顺序,则唯一排序会失败;也就是说,在两个或多个项目具有相同排序字段值时会出现此情况。如果排序不唯一,将引发错误。仅当显式指定排序字段时,排序逻辑才使用该 unique
属性值。如果未显式指定排序字段,则具有相同值元素时也不会引发错误。
默认值为 false。
实现
public function get unique():Boolean
public function set unique(value:Boolean):void
Sort | () | 构造函数 |
public function Sort()
语言版本: | ActionScript 3.0 |
产品版本: | Flex 4.5 |
运行时版本: | Flash Player 10.1, AIR 2.5 |
构造函数。
创建一个不带字段集和自定义比较运算符的新 Sort。
findItem | () | 方法 |
public function findItem(items:Array, values:Object, mode:String, returnInsertionIndex:Boolean = false, compareFunction:Function = null):int
语言版本: | ActionScript 3.0 |
产品版本: | Flex 4.5 |
运行时版本: | Flash Player 10.1, AIR 2.5 |
查找指定的数组内的指定对象(或插入点 — 如有要求)。如果找到,则返回其索引;如果未找到,则返回 -1。ListCollectionView
类的 findxxx()
方法使用此方法查找所需项目;一般来说,与 findItem()
相比,使用这些函数更易于在基于 ListCollectionView
的对象中查找数据。您可以在写入支持排序的类(如新的 ICollectionView
实现)时直接调用 findItem()
方法。调用该函数前需要对输入项数组进行排序。否则该函数无法正确找到指定值。
参数
items:Array — 要在其中进行搜索的 Array。
| |||||||
values:Object — 包含要查找的属性(或要查找的对象本身)的对象。此对象必须包含字段名/值对,其中的字段名是 fields 属性指定的字段的名称,其顺序与在此属性中使用的顺序相同。您不必指定 fields 属性中的所有字段,但不得在顺序中跳跃指定。因此,如果 fields 属性列出了三个字段,则可以指定此参数中的第一个和第二个字段,但不能仅指定第一个和第三个字段。
| |||||||
mode:String — 包含要执行的查找类型的字符串。有效值为:
| |||||||
returnInsertionIndex:Boolean (default = false ) — 如果该方法找不到由 values 参数标识的项目,并且此参数为 true ,则 findItem() 方法将返回这些值的插入点,也就是排序顺序中应插入此项目的点。
| |||||||
compareFunction:Function (default = null ) — 用于查找该项目的比较运算符函数。如果没有指定此参数,或提供了 null 值,则 findItem() 函数使用由 ISort 实例的 compareFunction 属性确定的比较函数,传入由值对象和当前 SortFields 确定的字段数组。如果您提供了非 null 值,则 findItem() 函数将其用作比较函数。作为 compareFunction 传递的函数签名必须如下所示:function myCompareFunction(a:Object, b:Object):int 。请注意,没有与 ISort.compareFunction() 属性的比较函数不同的第三个参数。
|
int — int,找到的项目在数组中的索引。如果 returnInsertionIndex 参数为 false 并且找不到项目,则返回 -1。如果 returnInsertionIndex 参数为 true 并且找不到项目,则返回已排序数组中将插入这些值的点的索引。
|
propertyAffectsSort | () | 方法 |
public function propertyAffectsSort(property:String):Boolean
语言版本: | ActionScript 3.0 |
产品版本: | Flex 4.5 |
运行时版本: | Flash Player 10.1, AIR 2.5 |
返回表明指定的属性是否用于控制排序的布尔值。如果排序使用自定义比较运算符,则函数无法确定确切的答案;在这种情况下,始终返回 true
。
参数
property:String — 要测试的字段的名称。
|
Boolean — 该属性值是否会影响排序结果。如果排序使用默认的 compareFunction,并且 property 参数指定了排序字段,则返回 true 。如果排序或任何 ISortField 使用自定义比较运算符,则无法进行判断,因此返回 true 。
|
reverse | () | 方法 |
public function reverse():void
语言版本: | ActionScript 3.0 |
产品版本: | Flex 4.5 |
运行时版本: | Flash Player 10.1, AIR 2.5 |
检查 fields
数组,对数组中每个 ISortField
对象调用 reverse()
。如果该字段原来为降序排序,则现在它将按升序排序,反之亦然。
注意:修改 fields
数组中的对象时不会自动更新 ICollectionView
;而调用 refresh()
方法可更新此视图。
sort | () | 方法 |
ANY_INDEX_MODE | 常量 |
public static const ANY_INDEX_MODE:String = "any"
语言版本: | ActionScript 3.0 |
产品版本: | Flex 4.5 |
运行时版本: | Flash Player 10.1, AIR 2.5 |
执行查找时返回任何匹配项的索引。
FIRST_INDEX_MODE | 常量 |
public static const FIRST_INDEX_MODE:String = "first"
语言版本: | ActionScript 3.0 |
产品版本: | Flex 4.5 |
运行时版本: | Flash Player 10.1, AIR 2.5 |
执行查找时返回第一个匹配项的索引。
LAST_INDEX_MODE | 常量 |
public static const LAST_INDEX_MODE:String = "last"
语言版本: | ActionScript 3.0 |
产品版本: | Flex 4.5 |
运行时版本: | Flash Player 10.1, AIR 2.5 |
执行查找时返回最后一个匹配项的索引。
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <!-- Sample program for spark.collections.Sort and SortField --> <fx:Declarations> <s:Sort id="sortbyLastName_FirstName"> <s:fields> <s:SortField name="last"/> <s:SortField name="first"/> </s:fields> </s:Sort> <mx:ArrayCollection id="collection" sort="{sortbyLastName_FirstName}"> <mx:source> <fx:Object first="Anders" last="Dickerson"/> <fx:Object first="Eileen" last="Maccormick"/> <fx:Object first="Aiden" last="MacCormick"/> <fx:Object first="Steve" last="MacGregor"/> </mx:source> </mx:ArrayCollection> </fx:Declarations> <s:VGroup> <s:VGroup> <s:HGroup> <s:Label text="Input Locale ID Name: "/> <s:TextInput id="inputLocaleIDName"/> <!-- Sets the locale style on the document UI component. The SortField and Sort objects defined in the fx:Declarations section will inherit this style. --> <s:Button click="{setStyle('locale', inputLocaleIDName.text); collection.refresh()}" label="Apply"/> </s:HGroup> <s:Label text="Example: 'en-US', 'fr-FR', 'zh-CN', 'ar-SA'"/> </s:VGroup> <s:DataGrid dataProvider="{collection}" width="100%" creationComplete="{collection.refresh()}"> <s:columns> <s:ArrayList> <s:GridColumn dataField="last"/> <s:GridColumn dataField="first"/> </s:ArrayList> </s:columns> </s:DataGrid> </s:VGroup> </s:Application>
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="initApp()"> <!-- Sample program for spark.collections.Sort and SortField --> <fx:Script> <![CDATA[ import mx.collections.ArrayCollection; import spark.collections.*; [Bindable] private var collection:ArrayCollection = new ArrayCollection(); private function localeChange():void { // Sets the locale style on this application. // The SortField objects will inherit this style. setStyle('locale', inputLocaleIDName.text); collection.refresh(); } private function initApp() : void { // Add data to the collection. collection.addItem({first:"Anders", last:"Dickerson"}); collection.addItem({first:"Steve", last:"Maccormick"}); collection.addItem({first:"Aiden", last:"MacCormick"}); collection.addItem({first:"Eileen", last:"MacGregor"}); // Create the Sort instance. var sort:Sort = new Sort(); // Set the sort field; sort on the last name first, first name // second. var sortfieldLastName:SortField = new SortField("last",true); var sortfieldFirstName:SortField = new SortField("first",true); sort.fields = [sortfieldLastName, sortfieldFirstName]; // Add the sort field objects to this application's list of // style clients. This will cause the sort field objects to // inherit the locale style from this Application. addStyleClient(sortfieldLastName); addStyleClient(sortfieldFirstName); // Assign the Sort object to the view. collection.sort = sort; // Apply the sort to the collection. collection.refresh(); } ]]> </fx:Script> <s:VGroup> <s:VGroup> <s:HGroup> <s:Label text="Input Locale ID Name: "/> <s:TextInput id="inputLocaleIDName"/> <s:Button click="localeChange()" label="Apply"/> </s:HGroup> <s:Label text="Example: 'en-US', 'fr-FR', 'zh-CN', 'ar-SA'"/> </s:VGroup> <s:DataGrid dataProvider="{collection}" width="100%" creationComplete="{collection.refresh()}"> <s:columns> <s:ArrayList> <s:GridColumn dataField="last"/> <s:GridColumn dataField="first"/> </s:ArrayList> </s:columns> </s:DataGrid> </s:VGroup> </s:Application>
Tue Jun 12 2018, 11:04 AM Z