在dojo dgrid中不区分大小写的排序

str*_*ght 2 javascript dojo dgrid

是否可以在不区分大小写的情况下进行排序?

例如,默认情况下,排序显示如下:

Awesomeman
adam
beyonce
Run Code Online (Sandbox Code Playgroud)

但是,我想要像:

adam
Awesomeman
beyonce
Run Code Online (Sandbox Code Playgroud)

是否有可能轻易超越灵敏度?从我可以告诉网格继承OnDemandGridOnDemandList,它们都继承自GridList.对于我的商店,我正在使用Memory包装Observable.

截至目前,我正在尝试覆盖_setSortList.js,但是这不是工作.那些熟悉这些框架的人?

Ken*_*iro 7

有两种方法可以解决这个问题:

  • 在网格端,通过处理和取消dgrid-sort事件
  • 在商店一端,通过扩展query到强制sort做你想做的事(首选)

一,dgrid-sort版本:

grid.on('dgrid-sort', function (event) {
    // Cancel the event to prevent dgrid's default behavior which simply
    // passes the sort criterion through to the store and updates the UI
    event.preventDefault();
    // sort is an array as expected by the store API, but dgrid's UI only sorts one field at a time
    var sort = event.sort[0];
    grid.set('sort', function (a, b) {
        var aValue = a[sort.attribute].toLowerCase();
        var bValue = b[sort.attribute].toLowerCase();
        if (aValue === bValue) {
            return 0;
        }
        var result = aValue > bValue ? 1 : -1;
        return result * (sort.descending ? -1 : 1);
    });
    // Since we're canceling the event, we need to update the UI ourselves;
    // the `true` tells it to also update dgrid's internal representation
    // of the sort setting, so that toggling between asc/desc will still work
    grid.updateSortArrow(event.sort, true);
});
Run Code Online (Sandbox Code Playgroud)

虽然这适用于用户在标题单元格中单击时的处理,但它不会对编程set('sort')调用或sort传递给Grid构造函数的对象中的初始设置生效,这可能会有问题.

由于排序最终是商店关注的问题,因此在商店端解决它实际上是更好的解决方案.不可否认的是dojo/store/Memory,dojo/store/util/SimpleQueryEngine这并不是......好......简单......但有一点需要注意的SimpleQueryEngine是,如果你通过一个函数queryOptions.sort而不是一个数组,它将逐字地应用为要使用的排序函数.

这意味着我们可以获取sortdgrid将设置的传入数组,编写我们自己版本SimpleQueryEngine的默认排序函数,同时还考虑不区分大小写,并将其存储queryOptions.sort为继承的调用:

var CIMemory = declare(Memory, {
    query: function (query, queryOptions) {
        var sort = queryOptions && queryOptions.sort;
        if (sort) {
            // Replace sort array with a function equivalent that performs
            // case-insensitive sorting
            queryOptions.sort = function (a, b) {
                for (var i = 0; i < sort.length; i++) {
                    var aValue = a[sort[i].attribute].toLowerCase();
                    var bValue = b[sort[i].attribute].toLowerCase();
                    if (aValue !== bValue) {
                        var result = aValue > bValue ? 1 : -1;
                        return result * (sort[i].descending ? -1 : 1);
                    }
                }
                return 0;
            }
        }
        return this.inherited(arguments);
    }
});
Run Code Online (Sandbox Code Playgroud)

使用它代替dojo/store/Memory将导致所有种类都不区分大小写.

请注意,我花了几个快捷键上SimpleQueryEnginesort功能(检查空/未定义,强迫值原语).如果您需要担心其中任何一项,请根据需要更改排序功能.