Flex 中可用的排序功能假设您可以访问所有数据,但我使用的是分页数据网格(带有自定义代码),数据网格绑定到 ArrayCollection 实例,在下一页调用我更改数据的数据提供者和一切正常,但为了排序,我需要覆盖点击或事件更好地覆盖arraycollection的排序方法
所有这些都是为了能够进行服务器端排序。
有没有人遇到过这种问题?
Flex 中可用的排序功能假设您可以访问所有数据,但我使用的是分页数据网格(带有自定义代码),数据网格绑定到 ArrayCollection 实例,在下一页调用我更改数据的数据提供者和一切正常,但为了排序,我需要覆盖点击或事件更好地覆盖arraycollection的排序方法
所有这些都是为了能够进行服务器端排序。
有没有人遇到过这种问题?
以下是我用来解决这个问题的步骤……这个解决方案的好处是我可以允许 Flex 与我一起“排序”,这使得排序方向图标在 DataGrid 上可见。
脚步:
使用 DataGrid 的 headerRelease 事件来拦截“排序”请求。
保留列的本地映射及其当前的排序方向...这是 flex 在其排序上所做的模拟...所以所有列都以“升序”开头,然后仅在给定列时切换方向连续点击两次。这可能可以通过观察 flex 内部结构来完成,但我不想尝试。
headerRelease 事件使用其事件中的请求列,以及先前请求的列和当前列排序方向的映射来决定是否更新本地映射中的排序方向。
调用服务器以获取适当排序的数据页面。
此时,Flex 也希望对数据进行排序......(除非您阻止默认() headerRelease 事件)......以允许 Flex 对数据进行“排序”而不会弄乱任何东西,这样方向图标就会继续功能正常,您可以:
在服务器上的 SQL 结果集中添加一个“行 id”字段,它只是结果集中每个连续行的计数器,在它被排序和分页之后......这个 id 总是升序的,不管是什么排序应用方向。
将 DataGridColumns 上的 sortCompareFunction 设置为使用此行 ID 的“虚拟”排序......如下所示:
public function doNothingSort( a:Object, b:Object ):int { if( weAreCurrentlyInAscendingDirection ) return ObjectUtil.numericCompare( a.new, b.num ); else return ObjectUtil.numericCompare( b.num, a.num ); }
这将允许 flex 遍历“页面”并保持一切原样......所以它很高兴,你很高兴,因为你有图标......
我实现了以下解决方案,目前运行良好,但可能还有一些改进之处。
我扩展了 ArrayCollection 类并覆盖了排序集/获取和刷新方法
package custom
{
import mx.collections.ArrayCollection;
import mx.collections.Sort;
/**
* Dispatched when a sort is required
*
* @eventType custom.PaginatedCollectionEvent.SORT
*/
[Event(name="sort" , type="custom.PaginatedCollectionEvent")]
public class PaginatedCollection extends ArrayCollection
{
private var _sort:Sort;
public function PaginatedCollection(source:Array=null)
{
super(source);
}
public function setDefaultSort (s:Sort):void
{
_sort = s;
}
override public function set sort(s:Sort):void
{
_sort = s;
if (!s)
return;
var event:PaginatedCollectionEvent = new PaginatedCollectionEvent(PaginatedCollectionEvent.SORT);
event.fields = s.fields;
event.s = s;
this.dispatchEvent(event);
}
override public function get sort():Sort
{
return _sort;
}
/**
* Avoid the internal sorting implementation, with this it's possible
* to do a server side sort.
*
* @return true
*/
override public function refresh():Boolean
{
return true;
}
/**
* Wrapper for ArrayCollection refesh implementation
*/
public function superRefresh():Boolean
{
return super.refresh();
}
}
}
我理解这样的问题:
他在 flex 客户端中拥有总数据的一部分。因为客户端不知道所有的数据,所以不能在客户端进行排序。他已经有服务器端排序工作。
他现在需要做的是:当用户单击数据网格的标题时,他想进行服务器调用并取回排序后的数据。单击网格标题时的默认行为是数据在客户端排序。所以这就是为什么他需要一些客户端。
我发现的唯一一件事是:
<mx:DataGrid xmlns:mx="http://www.adobe.com/2006/mxml"
headerRelease="onHeaderRelease(event)">
只要单击标题上的鼠标按钮(再次释放鼠标按钮),就会调用指定的函数 onHeaderRelease。
示例函数。也许你可以从这里接
public function onHeaderRelease(evt:DataGridEvent):void
{
var grd:DataGrid = DataGrid(evt.currentTarget);
Alert.show(evt.columnIndex + " : " + (DataGridColumn)(grd.columns[evt.columnIndex]).sortDescending, "ColumnIndex : Sorted Descending?");
// do the server called and get the sorted array back
}
我希望这能帮到您!
我不确定我是否真的理解这个问题,但听起来你需要在服务器端进行排序。如果您没有将所有数据加载到 flex 应用程序中,则无法对其进行排序。