Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 具有服务器端支持的Flex自定义排序功能_Apache Flex_Sorting_Datagrid_Arraycollection - Fatal编程技术网

Apache flex 具有服务器端支持的Flex自定义排序功能

Apache flex 具有服务器端支持的Flex自定义排序功能,apache-flex,sorting,datagrid,arraycollection,Apache Flex,Sorting,Datagrid,Arraycollection,Flex中可用的排序功能假设您可以访问所有数据,但我使用的是分页的datagrid(带有自定义代码),datagrid绑定到ArrayCollection实例,在下一个页面调用中,我更改了dataprovider的数据,一切正常,但是对于排序,我需要重写click或event,更好地重写arraycollection的sort方法 所有这些都是为了能够进行服务器端排序 有人遇到过这种问题吗?我不确定自己是否真正理解这个问题,但听起来您需要在服务器端进行排序。如果没有将所有数据加载到flex应用程

Flex中可用的排序功能假设您可以访问所有数据,但我使用的是分页的datagrid(带有自定义代码),datagrid绑定到ArrayCollection实例,在下一个页面调用中,我更改了dataprovider的数据,一切正常,但是对于排序,我需要重写click或event,更好地重写arraycollection的sort方法

所有这些都是为了能够进行服务器端排序


有人遇到过这种问题吗?

我不确定自己是否真正理解这个问题,但听起来您需要在服务器端进行排序。如果没有将所有数据加载到flex应用程序中,则无法对其进行排序。

我对问题的理解如下:

他拥有flex客户端中总数据的一部分。由于客户端不知道所有数据,因此无法在客户端进行排序。 他已经有了服务器端分拣工作

他现在需要做的是:当用户单击datagrid的标题时,他希望进行服务器调用并获取排序后的数据。 单击网格标题时的默认行为是在客户端对数据进行排序。 所以这就是为什么他需要做一些客户方面的事情

我唯一发现的是:

<mx:DataGrid xmlns:mx="http://www.adobe.com/2006/mxml"
headerRelease="onHeaderRelease(event)">

我希望这对你有帮助

我实现了下面的解决方案,目前效果很好,但可能还有一些改进

我扩展了ArrayCollection类并重写了sort set/get和refresh方法

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随同我一起“排序”,这样可以使排序方向图标在DataGrid上保持可见

步骤:

  • 使用DataGrid的headerRelease事件拦截“排序”请求

  • 保留列及其当前排序方向的本地映射。。。这是flex在其同类产品上所做的模拟。。。因此,所有列都以“升序”开头,然后只有在一行中单击给定列两次时才切换方向。这可能是通过观察flex内部结构来实现的,但我不想尝试

  • headerRelease事件使用其事件中请求的列、先前请求的列和当前列排序方向的映射来决定是否更新本地映射中的排序方向

  • 调用服务器以获取正确排序的数据页

  • 此时,Flex也想对数据进行排序。。。(除非您阻止headerRelease事件的默认值)。。。要允许Flex对数据进行“排序”,而不会弄乱任何东西,并使方向图标继续正常工作,您可以:

  • 在服务器上的SQL结果集中添加一个“row id”字段,在排序和分页之后,它只是结果集中每个连续行的计数器。。。无论应用何种排序方向,此id始终为升序

  • 将DataGridColumns上的排序比较设置为使用此行id的“虚拟”排序。。。因此:


  • 这将允许flex在“页面”中运行,并保持一切不变。。。所以它很高兴,你也很高兴,因为你有图标…

    确切地说,我想做服务器端排序,但我不知道必须覆盖哪个方法,现在我正在尝试实现sort()方法,但我不确定这是否是最好的方法,我已经尝试在datagrid头上覆盖click事件,但没有得到好的结果。我不确定您是否理解我所说的服务器端。您连接到什么语言来获取数据?不管是什么,您是否使用sql检索要提供给flex的数据?如果是这样,就把你的那一类放在那里。flex中的重写方法与服务器端完全无关。您是如何在AdvancedDataGrid中实现这种排序的?感谢您的回答,我试图避免视觉技巧(连接鼠标单击事件等),主要是因为这不允许我使用几乎标准的网格。我也尝试过这种方法。不知何故,排序字段是空的。我在Flex端使用了不同的“虚拟”排序方法:在处理程序函数中使用preventDefault。因为我已经有了排序列的本地映射,所以在从服务器获取数据之后,我会手动将相同的排序应用于我的数据提供程序。我扩展了Sort类并重写了Sort()函数,因此只需不执行任何操作并返回。我在数据提供程序上使用这个DummySort类。
    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();
        }
    }
    
    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 );
    }