YUI3的DataTable数据排序查询

YUI3的DataTable组件本身支持数据排序,只要在定义列的时候加上:sortable: true就可以了

这里我们要解决的首先是远程排序问题

远程排序就是所有数据进行排序,而不是表格本身默认的点击后在当页进行排序

这个我们可以通过DataTable组件的sort方法处理

例如:

        table.after(‘sort‘, function(e) {
            var page = _getCurrentPage();
            var key = _getCurrentKey();
            doSearch(key, page);
        });
    

这样在点击了表头的排序后,可以调用doSearch方法

doSearch可以这样写

    var doSearch = function(key, page, clearsort) {
        var param = _getParam();
        var field = ‘‘;
        var asc = true;
        if (clearsort == true) {
            table.set(‘sortBy‘, ‘‘);
        }
        else {
            var sort = table.get(‘sortBy‘);
            if (sort != null && sort[0] != null) {
                for (var p in sort[0]) {
                    field = p;
                    asc = sort[0][p] == 1 ? true : false;
                }
            }
        }
        var configuration = {
            method: ‘POST‘,
            data: Y.mix({ key: key, page: page, sort: field, asc: asc, method: ‘search‘}, param),
            on: {
                complete: function(o) {
                    var data = Y.JSON.parse(o.data.responseText);
                    table.set(‘data‘, data.items);
                }
            }
        };
        var io = new Y.IO({ emitFacade: true, bubbles: true });
        io.send(‘Search.ashx‘, configuration);
    };

这里_getParam方法是获取用户选择的查询参数,clearsort参数是当用户点击了刷新、查询等按钮时,要清除掉排序标记
后台代码根据获取的参数进行排序查询

我在实际开发中遇到一个问题:当后台返回的某一列数据类型是string,但里面又有数值数据时,如果要依据数值的大小排序如何处理

实际上,后台在进行sql查询时已经通过sql处理过了,将此列中能转换为数值的先转换为数值型排序,不能转换的变为最小值(我的逻辑里最小值就当0处理了),然后先根据数值结果排序,再根据本身文本排序,但问题是,数据转到前台后,此列的排序仍然是错误的

而且,根据不同的浏览器,这个排序结果还异常的不同,有的浏览器是按照返回结果进行行显示的,有的是混乱的顺序

我尝试让DataTable不进行排序事件的默认执行命令的方法无效,本来考虑在后台将能转成数值型的在输出JSON时转成数值型

最后还是采用了这个办法:

DataTable的列定义时支持自定义排序函数,我们这么写:

   var sortfunc = function(a, b, desc) {
        var sort = table.get(‘sortBy‘);

        var field;
        for (var p in sort[0]) {
            field = p;
        }

        var avalue = a.get(field);
        var bvalue = b.get(field);
        var order;
        if (!isNaN(avalue) && !isNaN(bvalue)) {
            order = parseFloat(avalue) > parseFloat(bvalue) ? 1 : -1;
        }
        else {
            order = avalue > bvalue ? 1 : -1;
        }
        return desc ? -order : order;
    };

在排序时进行处理,先判断是否能转换成数值型,能的话用数值型排序,不能用默认排序

然后在定义的列里,指定该列的sortFn为sortfunc

我的代码里这里的列是动态生成的,所以我是这么处理的:

        var newcolumn = eval(data.header);
        newcolumn.each(function(k, v) {
       k.sortFn = unsortfunc;        });
......
        table = new Y.DataTable({
            columns: newcolumn.concat(columns),
            scrollable: ‘x‘,
            width: ‘100%‘,
            data: []
        }).render(‘#tablearea‘);

其中columns是固定列,newcolumn是动态创建列
这样生成的动态列就可以在前台正确的进行数值排序了

YUI3的DataTable数据排序查询

时间: 2024-10-10 21:22:05

YUI3的DataTable数据排序查询的相关文章

MySQL使用笔记(七)排序和限制数据记录查询

By francis_hao    Dec 17,2016 排序数据记录查询 排序是指将筛选出符合条件的数据进行有序排放,有升序(ASC(默认))方式和降序(DESC)方式. mysql> select field1 field2-- from table_name [where 条件] order by fieldm1 [asc|desc],fieldm2 asc|desc,--; 这里的第二个排序字段,会在第一个排序字段相同的情况下进行排序.若第一个排序字段没有相同项,则第二个排序字段无作用

DataSet 中的数据排序 及 DataRow装成DataTable

1.DataSet 中的数据排序 DataSet ds = new DataSet(); // 获取当前排口的数据 ds = _xiaobill.GetHistoryData(yinZiBianm, zhanDian, beginDate, endDate, dNum); DataTable dt = ds.Tables[0]; DataRow[] dt2 = dt.Select("1=1","数据时间 ASC "); DataRow[]装成DataTable Da

PHP二维数据排序,二维数据模糊查询

一.因为项目中的一个报表需要合并三个表的数据,所以分表查询再合并数据,利用PHP数组函数进行排序,搜索.三表合并后的数组结构如下: Array ( [0] => Array ( [history_id] => 12 [sla_group_id] => 1 [sla_id] => -1 [create_time] => 1513057695 [tasklog_id] => 12 [tasklog_time] => 2017-12-12 13:48:15 [taskl

Web jquery表格组件 JQGrid 的使用 - 8.Pager、新增数据、查询、刷新、查看数据

系列索引 Web jquery表格组件 JQGrid 的使用 - 从入门到精通 开篇及索引 Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数.ColModel API.事件及方法 Web jquery表格组件 JQGrid 的使用 - 5.Pager翻页.搜索.格式化.自定义按钮 Web jquery表格组件 JQGrid 的使用 - 6.准备工作 & Hello JQGrid Web jquery表格组件 JQGrid 的使用 - 7.查询数据.编辑数据.删除数据

数据提高查询速度的方法(摘抄)

处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:     select id from t where num is null     可以在num上设置默认值0,确保表中num列没有

2016/3/13 七种查询 (普通查询 条件查询 排序查询 模糊查询 统计查询 分组查询 分页查询 )

一句话概括的话,SQL作为结构化查询语言,是标准的关系型数据库通用的标准语言: T-SQL 是在SQL基础上扩展的SQL Server中使用的语言 1,普通查询 #查询Info表中的所有列 select * from Info #查询Info表中的Name和Code列 select Name,Code from Info 2,条件查询 关键字where #查询Info表的左右列 限定范围 列名为p001 select * from Info where 列名="p001" #查询条件之

linq根据传入数据集合查询对应子级数据

工作中经常用到的linq根据传入数据集合查询对应子级数据,整理共享,希望大家都能用得上,代码中doublesArray 为父节点对应ID数据集合,再根据ID数据集合查询全部子级数据. //获取缓存数据 object obj = Caching.GetCache(CacheKey + UModel.RoleId); if (obj != null)//判读缓存数据是否null { SysFunList = (DataSet)obj; } else { string strSql = "select

处理百万级以上的数据提高查询速度的方法

处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:     select id from t where num is null     可以在num上设置默认值0,确保表中num列没有

DataTable数据转换为实体

我们在用三层架构编写软件时,经常会遇到如下问题,就是三层之间的参数传递问题:如果我们在D层查询出数据是DataTable类型的,那么我们在B层甚至U层使用这条数据时,就要用DataTable类型来回传递了,无论什么情况,我们都会不可避免的要填写读取的字段.例如我们需要使用第一条记录的的某个字段,代码需要这样写:mrc.count(*)rows(*).这样写的坏处有很多: 1.容易写错,并且编译器是检查不出来的: 2.我们需要详细的了解数据库的结构: 3. 不符合面向对象编程思想. 这个问题研究了