簡體   English   中英

Dojo Dgrid中不區分大小寫的排序

[英]Non case-sensitive sorting in dojo dgrid

是否可以在不區分大小寫的情況下進行排序?

例如,默認情況下,排序顯示如下:

Awesomeman
adam
beyonce

但是,我想排序:

adam
Awesomeman
beyonce

是否可以輕松地覆蓋靈敏度? 據我所知,網格繼承自OnDemandGridOnDemandList ,它們均繼承自GridList 對於我的商店,我使用包含在Observable Memory

截至目前,我正在嘗試覆蓋_setSort中的List.js ,但是這不起作用。 那些熟悉這些框架的人?

有兩種潛在的解決方法:

  • 在網格端,通過處理和取消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);
});

雖然這適用於用戶單擊標題單元格時的處理,但它不會對編程set('sort')調用生效,也不會對傳遞給Grid構造函數的對象中的sort的初始設置生效,這可能會有問題。

由於排序最終是商店關注的問題,因此在商店端解決它實際上是更好的解決方案。 不可否認的是dojo/store/Memory ,即dojo/store/util/SimpleQueryEngine並沒有讓這......簡單......但是有一點需要注意的是SimpleQueryEngine ,如果你通過queryOptions.sort傳遞一個函數而不是比數組,它將逐字應用作為要使用的排序函數。

這意味着我們可以獲取dgrid將設置的傳入sort數組,編寫我們自己的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);
    }
});

用它代替dojo/store/Memory會使所有類型都不區分大小寫。

請注意,我在SimpleQueryEnginesort函數上檢查了幾個快捷方式(檢查null / undefined並將值強制轉換為基元)。 如果您需要擔心其中任何一項,請根據需要更改排序功能。

好了,由於缺乏一個更好的解決辦法,我發現,我不得不創建道場的自定義版本SimpleQueryEngine ,加入.toLowerCase()兩個值的位置 它不能簡單地改變的原因是因為它發生在內部函數內部(在另一個函數內部)所以更容易完全制作另一個版本。

然后,在創建Memory ,傳入查詢引擎,如下所示:

new Memory({ queryEngine : customEngine });

它似乎工作。 如果有更清潔的解決方案請分享bc我討厭這一個:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM