Dojo 增强网格嵌套排序无法排序

Posted

技术标签:

【中文标题】Dojo 增强网格嵌套排序无法排序【英文标题】:Dojo Enhanced Grid nested sorting not able to sort 【发布时间】:2013-03-29 14:02:37 【问题描述】:

我正在使用带有分页和嵌套排序插件的 Dojo 增强网格。在网格中,当我单击列标题上的向下箭头时,元素没有正确排序。 假设我有: 哈尔 阿马尔 米米德1 米米德2 1 2

所以当我对它们进行排序时,它们变成: 1 2 米米德1 米米德2 阿马尔 xhar

我希望订单是:1 2 amar Memid1 Memid2 xhar 这是为什么?可以做些什么来避免这种情况?

【问题讨论】:

【参考方案1】:

就像 Lucian 说的,你可以编写自己的排序方法。正如您在documentation 中所读到的,您可以通过添加NestedSorting 插件来启用自定义排序。您可以通过添加以下内容来做到这一点:

dojo.require("dojox.grid.enhanced.plugins.NestedSorting");

然后你只需要在你的网格对象上设置属性nestedSorting: true

排序本身并不依赖于网格,而是依赖于商店。您可以在ItemFileReadStore 的documentation 中阅读有关自定义排序的更多信息。你想做的是这样的:

grid.store.comparatorMap = new Object();
grid.store.comparatorMap["col1"] = function(a, b) 
    if (a.toLowerCase() < b.toLowerCase()) 
         return -1;   
     else if (a.toLowerCase() == b.toLowerCase()) 
        return 0;
     else 
        return 1;
    
;

如您所见,我修改了col1 的比较器映射,您需要将其修改为您需要的列。 该函数本身是纯 javascript,并且在许多语言中都可以进行比较。如果在排序时字符串 a 应该在字符串 b 之前,则返回一个负数 (-1),当两个字符串相等时,您需要返回 0,如果字符串 b 应该在字符串 a 之前,则返回 1。 要启用不区分大小写,您需要比较两个字符串的小写变体。

我用新增的内容更新了我之前的 JSFiddle(上一个问题),并在 Dojo 1.6 下对其进行了测试。结果可见here。

【讨论】:

【参考方案2】:

创建一个只有小写值的列并使用该列进行排序,但不要在您的网格中显示该列。隐藏此列。小写字母似乎排在大写字母之后,因此您需要将所有内容都设为小写。

另一种可能性是编写您自己的排序方法并将其连接到您的网格。

【讨论】:

以上是关于Dojo 增强网格嵌套排序无法排序的主要内容,如果未能解决你的问题,请参考以下文章

使用 dojo 工具包的网格时,如何使列无法排序?

dojo增强了网格服务器端分页无法正常工作

dojo datagrid 将在更改排序时使页面“跳转”

是否有带有上下文菜单的 dojo 增强网格示例

DoJo 增强的网格动态更新约束不起作用

Dojo 网格嵌套 json