[英]Non case-sensitive sorting in dojo dgrid
是否可以在不區分大小寫的情況下進行排序?
例如,默認情況下,排序顯示如下:
Awesomeman
adam
beyonce
但是,我想排序:
adam
Awesomeman
beyonce
是否可以輕松地覆蓋靈敏度? 據我所知,網格繼承自OnDemandGrid
和OnDemandList
,它們均繼承自Grid
和List
。 對於我的商店,我使用包含在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
會使所有類型都不區分大小寫。
請注意,我在SimpleQueryEngine
的sort
函數上檢查了幾個快捷方式(檢查null / undefined並將值強制轉換為基元)。 如果您需要擔心其中任何一項,請根據需要更改排序功能。
好了,由於缺乏一個更好的解決辦法,我發現,我不得不創建道場的自定義版本SimpleQueryEngine
,加入.toLowerCase()
兩個值的位置 。 它不能簡單地改變的原因是因為它發生在內部函數內部(在另一個函數內部)所以更容易完全制作另一個版本。
然后,在創建Memory
,傳入查詢引擎,如下所示:
new Memory({ queryEngine : customEngine });
它似乎工作。 如果有更清潔的解決方案請分享bc我討厭這一個:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.