str*_*ght 2 javascript dojo dgrid
是否可以在不区分大小写的情况下进行排序?
例如,默认情况下,排序显示如下:
Awesomeman
adam
beyonce
Run Code Online (Sandbox Code Playgroud)
但是,我想要像:
adam
Awesomeman
beyonce
Run Code Online (Sandbox Code Playgroud)
是否有可能轻易超越灵敏度?从我可以告诉网格继承OnDemandGrid和OnDemandList,它们都继承自Grid和List.对于我的商店,我正在使用Memory包装Observable.
截至目前,我正在尝试覆盖_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);
});
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将导致所有种类都不区分大小写.
请注意,我花了几个快捷键上SimpleQueryEngine的sort功能(检查空/未定义,强迫值原语).如果您需要担心其中任何一项,请根据需要更改排序功能.
| 归档时间: |
|
| 查看次数: |
1873 次 |
| 最近记录: |